APIControllerでセッションを使う

概要

.net MVC5を使ってWebサービスを作成しています。サーバサイドではJSONを返すAPIをメインにしました。 MVC5のAPI Controllerへセッションを使ってデータの受け渡しをした話。

はじめに

概要に書いたとおり.net MVC5を使ってWebサービスを構築しています。サーバからのデータ取得はREST APIを使ってJSONだけをもらうようにしました。 何らかの形で認証を行わないと、どこからでも叩かれてしまいます。セッションにログイン情報を格納してログイン状態をチェックしようとしたのですが、API Controllerはステートレスが基本らしく、素のままではセッションが使えませんでした。 ググってAPIControllerでもセッションを使えるようになったので、備忘録代わりに書いています。

対応方法

こちらを参考にしました。
Global.asax.cs / Controllerクラス / APIControllerクラス に追記すればできました。(usingは適当に追加してください)

@Global.asax.cs 下記内容を追記

private const string _WebApiPrefix = "api";

private static string _WebApiExecutionPath = String.Format("~/{0}", _WebApiPrefix);

protected void Application_PostAuthorizeRequest()
{

    if (IsWebApiRequest())
    {

        HttpContext.Current.SetSessionStateBehavior(SessionStateBehavior.Required);

    }

}

private static bool IsWebApiRequest()
{

    return HttpContext.Current.Request.AppRelativeCurrentExecutionFilePath.StartsWith(_WebApiExecutionPath);

}

@Controller

public ActionResult Login(HogeModel model)
{
   // セッション変数に格納
   Session["userName"] = model.UserName;

   // 以下、何らかの処理
}

@APIController

public class HogeAPIController : ApiController
{

    public IEnumerable<FugaModel> Get() {

        // セッションから情報取り出し
        var userName  = HttpContext.Current.Session["userName"].ToString();
        // 以下、何らかの処理
        return list;

    }

}

1 件のコメント :

  1. API Controllerでセッションが使えないことを初めて知りました。
    参考にさせていただきます。

    返信削除