15

バックグラウンド

  • .NET3.5を使用してIIS6(Win2003 Server)で実行されている1つのWebサイトがあります:site1.mysite.local
  • .NET4.0を使用してIIS7(Win2008 Server)で実行されている2番目のWebサイトがあります:site2.mysite.local

各サイトで、web.configにはStateServerと同じmachineKeyが含まれています。

<sessionState mode="StateServer" stateConnectionString="tcpip=STATESRV01:42424" />

<machineKey decryptionKey="EDCDA6DF458176504BBCC720B4E29348E252E652591179E2" validationKey="CC482ED6B5D3569819B3C8F07AC3FA855B2FED7F0130F55D8405597C796457A2F5162D35C69B61F257DB5EFE6BC4F6CEBDD23A4112C4519F55185CB5EB3DFE61"/>

また、同じルートドメインとパスを持つように「NET_SessionId」Cookieを変更するPostRequestHandlerExecuteイベントハンドラーもあります。

cookie.Domain = ".mysite.local";
cookie.Path = "/";

global.asaxファイルには、Application_Startイベントのアプリ名を変更するための次のコードがあります。

    protected void Application_Start(object sender, EventArgs e)
    {
        string applicationName = "mysiteapp";

        // Change the Application Name in runtime.
        FieldInfo runtimeInfo = typeof(HttpRuntime).GetField("_theRuntime",
            BindingFlags.Static | BindingFlags.NonPublic);
        HttpRuntime theRuntime = (HttpRuntime)runtimeInfo.GetValue(null);
        FieldInfo appNameInfo = typeof(HttpRuntime).GetField("_appDomainAppId",
            BindingFlags.Instance | BindingFlags.NonPublic);

        appNameInfo.SetValue(theRuntime, applicationName);
    }

結果

両方のサイトが同じセッションIDを返しますが、site1にセッション値を設定しようとすると、site2は値を返しません。

サイト1(site1.mysite.local)結果

Session ID (Session.SessionID): a55jnfcscxd3f0hnwoik02pp
Session Value: True

サイト2(site2.mysite.local)結果

Session ID (Session.SessionID): a55jnfcscxd3f0hnwoik02pp
Session Value: 

質問

私の理解では、State Serverは、SessionID cookie、マシンキー、および更新しようとしたアプリ名の組み合わせからセッションにキーを設定し、両方のサイトで同じになるようにします。問題は、セッション値がWebサイト間で共有されていないことです。

セッション状態にSQLServerモードを使用してみませんか?

必要かもしれませんが、代わりにStateServerを使用したいと考えていました。

複数のサーバーにまたがる複数のWebアプリケーションを備えたStateServerで成功した人はいますか?

4

2 に答える 2

4

.NET 3.5 と .NET 4 は、異なるバージョンの CLR を実行します。オブジェクトのシリアル化 (InProc を使用しない場合にセッション状態を格納するために使用される) は、.NET バージョンによって異なります。オブジェクトが別のプラットフォームでデシリアライズされていない可能性があるため、黙ってドロップします。SQL Server をセッション状態サーバーとしても使用すると、同じ問題が発生します。

これが問題であると仮定すると、両方のサイトが同じ .NET バージョン上にあることを確認するか、ディスクまたは SQL Server に対して独自のシリアル化を実行する必要があります。

于 2012-09-05T23:49:44.943 に答える
3

StateServer および SQLServer の状態管理では、セッション データのキーを作成する際に (アプリケーション名に加えて)アプリケーション パスも使用されます。

両方のアプリで Cookie が読み取られるため、アプリケーションは同じ SessionID を表示していますが、状態サーバーで同じセッション データを実際に読み取るには、アプリケーション パスも同じである必要があります。

この変数の Application_Start で追加の上書きを行うことで、同じ値に変更できます。

FieldInfo appPathInfo = typeof(HttpRuntime).GetField("_appDomainAppPath",
     BindingFlags.Instance | BindingFlags.NonPublic);

appPathInfo .SetValue(theRuntime, applicationName);
于 2012-09-06T01:38:36.723 に答える