我们有一个EPiServer 5.x企业项目,其中在EPiServer.config中声明了多个站点

这些站点在IIS中设置为单独的网站,指向同一webroot,将每个IIS站点的主机条目与在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,其中有一个名为的节点。首次访问Episerver站点时,它将添加一个与IIS站点ID与EPiServer站点ID匹配的键值。

出现“应用程序已使用siteId的设置初始化的应用程序...”错误的最常见原因是,例如,您已经重新安装了计算机(或在IIS中进行了小更改...),然后在其他位置设置了站点订购。例如,站点X第一次具有ID 1,但之后获得ID2。如果站点Y以前具有ID 2,并且已将其映射到EPiServerFramework.config中,则它将引发异常。

摆脱这种禁食的方法是


找到您尝试访问的站点的IIS ID
如果您不知道计算机名称,请右键单击“计算机”和“属性”(然后将在其中找到计算机名称)
打开EpiserverConfig并找到包含您的计算机名和IIS ID的行,您会注意到它已映射到另一个站点ID。
删除该行。
刷新站点。

关于c# - EPiServer.Configuration.Settings.Instance-使用siteId =“x”的设置初始化应用程序,但当前请求映射到siteId =“y”,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4864746/

10-10 21:47