3

EPiServer.config で宣言された複数のサイトを持つ EPiServer 5.x エンタープライズ プロジェクトがあります。

これらは、各 IIS サイトのホスト エントリが EPiServer.config で各サイトに宣言されている siteHosts に一致する同じ Web ルートを指す IIS の個別の Web サイトとしてセットアップされます。

<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 で 1 つまたは複数のサイトを再起動し、ブラウザーでそのサイトに移動するたびに (一見ランダムに) エラーをスローしてログに記録することです。

アプリケーションは 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 を取得しました。ID 2 を持っていたサイト Y があり、それを EPiServerFramework.config にマップした場合、例外がスローされます。

これを取り除く断食の方法は

  1. アクセスしようとしているサイトの IIS ID を見つける
  2. コンピューター名がわからない場合は、[コンピューター] と [プロパティ] を右クリックします (コンピューター名が表示されます)。
  3. EpiserverConfig を開き、コンピューター名と IIS ID の行を見つけると、別のサイト ID にマップされていることがわかります。
  4. その行を削除します。
  5. サイトを更新します。
于 2013-04-15T06:27:01.940 に答える
2

以前にも同じエラーが発生しました。私の場合、IIS のサイト用に複数のホスト ヘッダーが構成されていましたが、これらのホスト ヘッダーの 1 つが episerver.config のサイトホスト定義によると間違っていました。

複数のホスト ヘッダーを使用する場合は、それらを episerver.config ファイルと照合して、それらが同じ「サイト」で構成されていることを確認します。

于 2011-02-14T12:39:53.987 に答える