SharePoint Server で ASP.NET セッション状態を使用する

こんにちは SharePoint サポートの森 健吾 (kenmori) です。
今回の投稿では、SharePoint Server 2013/2010 において、ASP.NET セッション状態を使用する方法をご説明します。

ASP.NET セッション状態を使用すると、同一セッションを維持している限りは、サーバー側にデータを格納し、取り出すことが可能です。
下記のコードの様に Page.Session["<キー>"] に値を格納したり、取り出したりするだけで実現できます。

protected override void OnPreRender(EventArgs e)
{
    base.OnPreRender(e);
    try
    {
        // セッション状態からの読み込み
        Label1.Text = Page.Session["DATA"].ToString();
    }
    catch (Exception ex)
    {
        Label1.Text = "(none)";
    }
}

protected void Button1_Click(object sender, EventArgs e)
{
    // セッション状態への書き込み
    Page.Session["DATA"] += "<BR>" + DateTime.Now.ToString() + " " + TextBox1.Text;
}

しかし、SharePoint Server で、何も構成せずに上記のコードを含むWebパーツを展開して、表示させた際に、下記のようなエラーが診断ログに記録されます。

06/05/2015 21:48:26.99 w3wp.exe (0x1F38) 0x49D4 SharePoint Foundation General ajlz0 High Getting Error Message for Exception System.Web.HttpUnhandledException (0x80004005): 種類 'System.Web.HttpUnhandledException' の例外がスローされました。 ---> System.Web.HttpException (0x80004005): セッション状態は、構成ファイルまたは Page ディレクティブで enableSessionState が true に設定されているときのみ使用できます。System.Web.SessionStateModule またはカスタム セッション状態モジュールがアプリケーション構成の <configuration>\<system.web>\<httpModules> セクションに含まれていることも確認してください。 場所 System.Web.UI.Page.get_Session() 場所 SessionWebPart.SessionWP.SessionWP.Button2_Click(Object sender, EventArgs e) 場所 System.Web.UI.WebControls.Button.RaisePostBackEvent(String eventArgument) 場所 System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) 場所 System.Web.UI.Page.HandleError(Exception e) 場所 System.Web.UI.Page.Proces... 0c5f0d9d-2651-d0e4-46ae-66b4e29d6a5a

SharePoint Server はファーム構成で実装すると、Web フロント エンド サーバーが複数台存在することになります。ASP.NET の観点では、このような状況下で ASP.NET セッション状態を構成するためには、StateServer や SQLServer モードを使用することが適切ですが、SharePoint 上ではどのような構成を実施すれば良いのでしょうか。

タイトル : セッション状態モード
アドレス : https://msdn.microsoft.com/ja-jp/library/ms178586(v=vs.100).aspx

対処策

SharePoint Server で、ASP.NET セッション状態を使用する場合は、PowerShell で Enable-SPSessionStateService コマンドレットを下記の様に実行するだけで SQLServer モードのセッション状態が構成できます。

Enable-SPSessionStateService -DefaultProvision

上記のエラー メッセージは ASP.NET のモジュールが返していますので、SharePoint セッションを構成するためには、自動で構成を行う Enable-SPSessionStateService を実行するだけで問題ありません。

タイトル : Enable-SPSessionStateService
アドレス : https://technet.microsoft.com/ja-jp/library/ff607857.aspx

説明
上記コマンドを実行することで、セッション状態管理用のデータベースが生成されます。また Web アプリケーション ルートの web.config には下記のような記載が追加されます。

system.web 直下<sessionState mode="SQLServer" timeout="60" allowCustomSqlDatabase="true" sqlConnectionString="Data Source=DBServer;Initial Catalog=SessionStateService_34904ccc31b545a2a1c2dcd3231bea85;Integrated Security=True;Enlist=False;Pooling=True;Min Pool Size=0;Max Pool Size=100;Connect Timeout=15" />

system.webServer/modules 直下<add name="Session" type="System.Web.SessionState.SessionStateModule" />

上記構成の結果、Enable-SPSessionStateServiceコマンドレットを実行後であれば、前述のセッション状態を使用する Web パーツが正常に表示されます。

今回の投稿は以上になります。