EPiServer.Configuration.Settings.Instance - Приложение инициализируется с настройками для siteId = "x", но текущий запрос отображается на siteId = "y" - PullRequest
3 голосов
/ 01 февраля 2011

У нас есть корпоративный проект EPiServer 5.x с несколькими сайтами, объявленными в EPiServer.config

Они настроены как отдельные веб-сайты в IIS, указывающие на один и тот же веб-корень, соответствующий записи хоста для каждого сайта IIS и хостам сайта, объявленным для каждого сайта в EPiServer.config

<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" ниже, я могу видеть, что если текущий узел запроса не совпадает ни с одной из записей siteHost в EPiServer.config, он по умолчанию будет использовать сайт 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["*"];
}

Ответы [ 2 ]

4 голосов
/ 15 апреля 2013

В EPiServer 6 и выше есть этот раздражающий EPiServerFramework.config, у которого есть узел с именем . При первом доступе к сайту episerver добавляется значение ключа, которое совпадает с идентификатором сайта IIS с идентификатором сайта EPiServer.

Самая распространенная причина получения ошибки «Приложение инициализировано с настройками для siteId ...» заключается в том, что вы, например, переустановили компьютер (или внесли небольшое изменение в IIS ...), а затем настроили свои сайты в другом порядке. Например, сайт X имеет Id 1 в первый раз, но затем получает Id 2. Если у вас есть сайт Y, на котором раньше был Id 2, и он отображен в вашем EPiServerFramework.config, то он выдаст исключение.

Самый быстрый способ избавиться от этого -

  1. Найдите IIS Id для сайта, к которому вы пытаетесь получить доступ
  2. Если вы не знаете имя своего компьютера, щелкните правой кнопкой мыши на «Компьютер» и «Свойства» (и вы там увидите имя компьютера)
  3. Откройте EpiserverConfig и найдите строку с вашим именем компьютера и IIS Id, и вы заметите, что он сопоставлен с другим идентификатором сайта.
  4. Удалить эту строку.
  5. Обновить сайт.
2 голосов
/ 14 февраля 2011

Я сталкивался с той же ошибкой раньше. В моем случае у нас было несколько заголовков хостов, настроенных для сайтов в IIS, и один из этих заголовков хостов был неправильным согласно определению sitehosts в episerver.config.

Если вы используете несколько заголовков хостов, дважды проверьте их по отношению к файлам episerver.config, чтобы убедиться, что они настроены на одних и тех же «сайтах»

...