2012年4月30日月曜日

Web APIでのSession利用

いやもうまじで。そんなことしなくていいと思うんですけど。ステートレスでやればいいと思うんですけど。

c# - LinqToEntitiesDataController MVC 4 Single Page Application - Session variable - Stack Overflow

普通にやるとApiControllerってHttpContext.Curret.Sessionはnullですね。なぜかというと、Web API利用時にRouteに登録するHttpControllerRouteHandlerのGetHttpHandlerでは、IRequiresSessionStateインターフェース指定のないHttpControllerHandlerが使われているからです。

デスデス。それでいいと思います。

でも、どーしても使いたい、っていうなら、そーですね。IRequiresSessionStateを付けたものを用意しましょう。

public class SessionHttpControllerRouteHandler : HttpControllerRouteHandler
{
    protected override IHttpHandler GetHttpHandler(System.Web.Routing.RequestContext requestContext)
    {
        return new SessionHttpControllerHandler(requestContext.RouteData);
    }
}

public class SessionHttpControllerHandler : HttpControllerHandler, IRequiresSessionState
{
    public SessionHttpControllerHandler(RouteData routeData) : base(routeData) { }
}

このHttpControllerRouteHandlerをRouteTable登録に利用する。

routes.Add("SessionApis",
	new HttpWebRoute(
		url: "api/{controller}/{id}",
		defaults: new RouteValueDictionary(new {id = RouteParameter.Optional}),
		routeHandler: new SessionHttpControllerRouteHandler()
));

これだけ。

Web APIのデフォルトプロジェクトテンプレートで作成したHomeControllerのIndexでSessionに値を入れて、ValuesControllerのGetで参照してみる。

public class HomeController : Controller
{
	public ActionResult Index()
	{
		Session["message"] = "from Controller";
		return View();
	}
public class ValuesController : ApiController
{
	// GET /api/values
	public IEnumerable<string> Get()
	{

		var message = HttpContext.Current.Session["message"] + "";
		return new string[] { "value1", "value2", message };
	}

実行して、/api/valuesにアクセスしてみる。

sessionapi

ねー。

ちなみにLinqToEntitiesDataControllerはAreaRegistrationだから、そっちでRouteTableに登録しましょう。

っていうか、是非使わないような設計で。

2026年03月06日の記事一覧

(全 9 件) [ITmedia News] 厚労省、がん患者の5年生存率を公表 部位で異なる生存率 発症自体を防ぐ、予防可能な生活習慣とは? MCPはなぜCLIに負けたのか —— 経緯と構造を整理する ポッカ、自販機事業を売却し全国の4万台譲渡へ…商品販売は当面継続 ...