3

我们有一个 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["*"];
}
4

2 回答 2

4

在 EPiServer 6 及更高版本中,有一个令人讨厌的 EPiServerFramework.config,其中有一个名为 <automaticSiteMapping> 的节点。第一次访问 Episerver 站点时,它会添加一个匹配 IIS 站点 Id 和 EPiServer 站点 Id 的键值。

出现“应用程序已使用 siteId 的设置初始化...”错误的最常见原因是您重新安装了计算机(或在 IIS 中进行了小幅更改...),然后将您的站点设置为不同的命令。例如,站点 X 第一次具有 Id 1,但随后得到 Id 2。如果您的站点 Y 曾经具有 Id 2,并且您在 EPiServerFramework.config 中映射了该站点,那么它将引发异常。

摆脱这种情况的最快方法是

  1. 查找您尝试访问的站点的 IIS Id
  2. 如果您不知道您的计算机名称,请右键单击“计算机”和“属性”(您将在那里看到计算机名称)
  3. 打开 EpiserverConfig 并找到包含您的计算机名和 IIS Id 的行,您会注意到它被映射到另一个站点 Id。
  4. 删除该行。
  5. 刷新站点。
于 2013-04-15T06:27:01.940 回答
2

我以前遇到过同样的错误。我的情况是,我们为 IIS 中的站点配置了多个主机头,根据 Episerver.config 中的 sitehosts 定义,其中一个主机头是错误的。

如果您使用多个主机标头,请根据 episerver.config 文件仔细检查它们,以确保它们配置在相同的“站点”上

于 2011-02-14T12:39:53.987 回答