1

私のMVC4(beta)Azure WebRoleには、WebApiアクセス用のコントローラーがあります。これは、1つの小さな問題を除いて、正常に機能します。Global.asax.csSession_Startは、MVCページ(HomeControllerなど)にアクセスしたときにのみ呼び出されるようです。

シナリオ:私のWebApiコントローラーは(処理中の)セッション状態ストレージにアクセスする必要があります。Start_SessionのSessionStateオブジェクトにアクセスし、WebApiコントローラーで使用できるようにキャッシュします。これは、最初に単一のMVC-Web-Pageにアクセスする限り正常に機能しますが、最初にWebApiにアクセスすると、セッション状態キャッシュは初期化されませんが、ルーティングテーブルは初期化されているため、Global.asaxにアクセスしています。

このシナリオでの初期化またはセッション状態アクセスに関するヒントはありますか?最初にWebページにアクセスせずにWebApiコントローラーにアクセスする必要があります...

ありがとう!R

4

2 に答える 2

3

Global.asax 内

public override void Init()
{
    this.PostAuthenticateRequest += MvcApplication_PostAuthenticateRequest;
    base.Init();
}

void MvcApplication_PostAuthenticateRequest(object sender, EventArgs e)
{
    System.Web.HttpContext.Current.SetSessionStateBehavior(SessionStateBehavior.Required);
}
于 2013-02-23T08:38:30.497 に答える
2

これは、ASP.NETのフォーラム投稿です-PostAuthorizeRequestメソッドを使用してWebApi呼び出しのセッション状態を有効にする方法を示すセッションの有効化。参考までに、Global.asaxファイルの変更に以下のコードスニペットを含めました。

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

public static void RegisterRoutes(RouteCollection routes)
{
  routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

  routes.MapHttpRoute(
      name: "DefaultApi",
      routeTemplate: String.Format("{0}/{{controller}}/{{id}}", _WebApiPrefix),
      defaults: new { id = RouteParameter.Optional }
  );

}

protected void Application_PostAuthorizeRequest()
{
  if (IsWebApiRequest())
  {
    HttpContext.Current.SetSessionStateBehavior(SessionStateBehavior.Required);
  }
}

private static bool IsWebApiRequest()
{
  return HttpContext.Current.Request
       .AppRelativeCurrentExecutionFilePath.StartsWith(_WebApiExecutionPath);
}

これで問題が解決するようです。

于 2012-07-18T01:55:02.740 に答える