web-dev-qa-db-ja.com

ASP.NET Session State Serviceを使用してアプリケーション間でセッションを共有する

同じサーバーでホストされている2つのWebアプリケーション間でセッションを共有しようとしています。 1つは.net 2.0 Webフォームアプリケーションで、もう1つは.net 3.5 MVC2アプリケーションです。

両方のアプリのセッションは次のように設定されています。

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

Webフォームアプリケーションでは、セッションキーをMVCアプリに投稿しています:

protected void LinkButton1_Click(object sender, EventArgs e)
{
    Session["myvariable"] = "dan"; 
    string sessionKey = HttpContext.Current.Session.SessionID;

    //Followed by some code that posts sessionKey to the other application    
}

その後、MVCアプリケーションで受信し、次のような同じセッションを使用してみます。

[HttpPost]
public  void Recieve(string sessionKey )
{
    var manager = new SessionIDManager();

    bool redirected;
    bool IsAdded;

     manager.SaveSessionID(HttpContext.ApplicationInstance.Context, Id, out redirected, out IsAdded);
     var myVar = Session["myvariable"];

}

キーは送信されていますが、セッションはMVCアプリにロードされていないようです。つまり、sessionKeyがnullです。私がやろうとしていることはできますか?

47
Dan

私はこのようにしました:

基本的には、両方のアプリがsqlserverに保存されているネイティブの.net sessionStateを使用するという考え方です。同じマシンキーを使用し、ストアドプロシージャを少し調整することで、両方のアプリがセッションキーやフォーム認証を共有できます。

どちらのアプリもweb.configで次のようなことをします。

<sessionState mode="SQLServer" sqlConnectionString="Data Source=.\SQLEXPRESS;User Id=test;Password=test;Application Name=AppName"  />
    <machineKey
validationKey="SOMEKEY"
validation="SHA1" decryption="AES"
/>

セッション状態データベースは、両方のアプリが見ることができるデータベースサーバーで設定する必要があります。

これを行うためのドキュメント: http://msdn.Microsoft.com/en-us/library/ms229862(VS.80).aspx

実行する必要があるコマンド:C:\ Program Files(x86)\ Microsoft Visual Studio 9.0\VC\bin> aspnet_regsql.exe -E -ssadd --sstype p -S。\ SQLEXPRESS

ストアドプロシージャ(TempGetAppID)微調整:

 @appId int OUTPUT
AS

    -- start change

    -- Use the application name specified in the connection for the appname if specified
    -- This allows us to share session between sites just by making sure they have the
    -- the same application name in the connection string.
    DECLARE @connStrAppName nvarchar(50)
    SET @connStrAppName = APP_NAME()

    -- .NET SQLClient Data Provider is the default application name for .NET apps
    IF (@connStrAppName <> '.NET SQLClient Data Provider')
        SET @appName = @connStrAppName

    -- end change

SET @appName = LOWER(@appName)
72
Dan

問題は、セッションキーのスコープがアプリケーションに限定されているため、実際には同じセッションキーを持つ2つのアプリケーションが別々のセッションを持つことです。

次の2つのいずれかを実行できます。

  1. 両方のアプリケーションを共通のIIS Application。の下の仮想ディレクトリとして配置します。これは良い考えではありませんが、機能します。

  2. 共有するデータ用に独自のセッションデータソリューションを展開します。可能であれば、バックエンドデータベースを共通ストレージとして使用します(ある場合)。

ジャスティンのコメントに基づいて、オプション2を明確にするために、プロセス外セッションのSQL状態管理を参照していません。おそらくデータベースを使用して、2つのセッションの共有データを実際に手動で管理します。

9
Chris Taylor

共通のマシンキーを使用して、特定のユーザーの両方のアプリケーション内で同じセッションIDを生成できます。さらに、ASP.NET State Serviceや分散キャッシュなどの共通ストアに両方のアプリケーションのセッションを保存することも計画する必要があります。

異なるアプリケーション間でセッション共有機能を提供するNCache分散キャッシュを使用できます。セッション状態設定内で両方のアプリに同じアプリケーションIDタグを指定します。これにより、両方のアプリケーションに対して同じセッションIDが生成されていれば、セッションオブジェクトを共有できます。

0
Shoeb Lodhi