by WebSurfer
2012年1月17日 22:27
HTTP ハンドラ内では Session の読み書きができません。例えば、以下のようにすると context.Session は null になって NullReferenceException がスローされてしまいます。
string s = (string)context.Session["note"];
ご存知でしたでしょうか? 実は、自分はそのことを知らなくて、つい先日 1 時間ぐらいハマってしまいました。(笑)
この問題を解決するには、HTTP ハンドラのクラスにマーカーインターフェースを継承させ、この HTTP ハンドラは Session へのアクセスを必要としているという印を付けてやります。
そのマーカーインターフェイスは System.Web.SessionState 名前空間 に属しており、以下のとおり 2 種類あります。
-
IRequiresSessionState 読み取り/書き込みアクセス権を必要とすることを指定します。
-
IReadOnlySessionState 読み取り専用アクセス権のみが必要であることを指定します。
実際の使用例は、まぁ、書かなくても分るとは思いますが、以下のような感じです(この例では IRequiresSessionState を使用)。
<%@ WebHandler Language="C#" Class="_MyHttpHandler" %>
using System;
using System.Web;
using System.Web.SessionState;
public class _MyHttpHandler : IHttpHandler, IRequiresSessionState
{
public void ProcessRequest (HttpContext context)
{
byte[] data = (byte[])context.Session["PageResponse"];
if (data != null)
{
context.Response.BinaryWrite(data);
context.Session.Remove("PageResponse");
}
context.Response.End();
}
// 以下省略
マーカーインターフェイスはメソッドの定義を持たないので、一般的なインターフェイスを継承したときのように、継承したクラス内にメソッドを実装する必要はありません。