[英]EPiServer.Configuration.Settings.Instance - Application is initialized with settings for siteId=“x”, but current request maps to siteId=“y”
我们有一个EPiServer 5.x企业项目,在EPiServer.config中声明了几个站点
这些在IIS中设置为单独的网站,指向与每个IIS站点的主机条目匹配的相同webroot,以及为EPiServer.config中的每个站点声明的siteHosts。
<site description="Site 1" siteId="SiteOne">
<siteHosts>
<add name="www.siteone.se" language="sv" />
<add name="*"/>
</siteHosts>
<siteSettings .../>
</site>
<site description="Site 2" siteId="SiteTwo">
<siteHosts>
<add name="www.sitetwo.fi" language="fi" />
</siteHosts>
<siteSettings .../>
</site>
我们遇到的一个问题是,每当我们重新启动IIS中的一个或多个站点并在浏览器中导航到该站点时(看似随机)会抛出错误并记录:
使用siteId =“SiteOne”的设置初始化应用程序,但当前请求映射到siteId =“SiteTwo”
如果查看下面的“EPiServer.Configuration.Settings”类,我可以看到,如果当前请求主机与EPiServer.config中的任何siteHost条目都不匹配,它将默认使用带有通配符“*”的siteHost站点。
At least one <site> section must omit the <siteHosts> section, or <add name=\"*\"> to the <siteHosts> section.
问题 :为什么会发生这种情况? IIS中的站点配置为侦听单独的IP并绑定到特定主机。
问题 :由于EPiServer.Configuration.Settings.Instance有一个公共设置器,以后能够手动设置它是一个好主意吗? (通过一些.aspx或诸如此类而不是重新启动应用程序)
当然,最好是永久性地解决这个问题,而不是将一半烘焙的.aspx修复程序混在一起。
从类“EPiServer.Configuration.Settings”:
public static Settings Instance
{
get
{
if (HttpContext.Current == null)
{
if (_instance == null)
{
throw new ApplicationException("First time you call Settings.Instance you must have a valid HttpContext.");
}
return _instance;
}
Settings settings = MapUrlToSettings(HttpContext.Current.Request.Url);
if (_instance == null)
{
_instance = settings;
}
else if (_instance != settings)
{
throw new ConfigurationErrorsException(string.Format("Application is initialized with settings for siteId=\"{0}\", but current request maps to siteId=\"{1}\"", _instance.Parent.SiteId, settings.Parent.SiteId));
}
return _instance;
}
set
{
_instance = value;
}
}
public static Settings MapUrlToSettings(Uri url)
{
Settings settings;
if (url == null)
{
throw new ArgumentNullException("url", "An initialized Uri instance is required.");
}
if (!url.IsAbsoluteUri)
{
throw new ArgumentException("The Uri must be absolute to use for mapping.", "url");
}
if (!string.IsNullOrEmpty(url.DnsSafeHost))
{
settings = MapHostToSettings(url.DnsSafeHost, true);
}
else
{
settings = MapHostToSettings("*", true);
}
string absolutePath = url.AbsolutePath;
string str2 = settings.SiteUrl.AbsolutePath;
if (!absolutePath.StartsWith(str2, StringComparison.OrdinalIgnoreCase) && !string.Equals(absolutePath + "/", str2, StringComparison.OrdinalIgnoreCase))
{
throw new ConfigurationErrorsException(string.Format("The URL \"{0}\" maps to siteId=\"{1}\" but has a path that is outside the application root (application root is \"{2}\").", url.ToString(), settings.Parent.SiteId, settings.SiteUrl.AbsolutePath));
}
return settings;
}
public static Settings MapHostToSettings(string hostName, bool fallback)
{
Settings settings;
if (_hostToSettings == null)
{
InitializeAllSettings();
}
if (_hostToSettings.TryGetValue(hostName, out settings))
{
return settings;
}
if (!fallback)
{
return null;
}
return _hostToSettings["*"];
}
在EPiServer 6及更高版本中,有一个恼人的EPiServerFramework.config,它有一个名为<automaticSiteMapping>的节点。 第一次访问episerver站点时,它会添加一个将IIS站点ID与EPiServer站点ID匹配的键值。
获取“应用程序初始化为siteId的设置...”错误的最常见原因是您例如重新安装了您的计算机(或在IIS中进行了一些小改动...)然后将您的站点设置为不同的订购。 例如,站点X第一次具有Id 1,但随后获得Id 2.如果您的站点Y曾经拥有Id 2并且您已在EPiServerFramework.config中映射,那么它将引发异常。
解决这个问题的方法很简单
我之前遇到过同样的错误。 我的情况是,我们为IIS中的站点配置了多个主机头,根据episerver.config中的sitehosts定义,其中一个主机头是错误的。
如果您使用多个主机标头,请针对episerver.config文件仔细检查它们,以确保它们在相同的“站点”上配置
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.