いやもうまじで。そんなことしなくていいと思うんですけど。ステートレスでやればいいと思うんですけど。
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にアクセスしてみる。
ねー。
ちなみにLinqToEntitiesDataControllerはAreaRegistrationだから、そっちでRouteTableに登録しましょう。
っていうか、是非使わないような設計で。