Azure MVC4(测试版)WebApi Global.asax Session_Start未调用? WebApi会话状态访问?

时间:2012-07-17 19:46:15

标签: asp.net-mvc-4 session-state asp.net-web-api

我的MVC4(测试版)Azure WebRole具有用于WebApi访问的控制器。这样可以正常工作,除了一个小问题:看起来Global.asax.cs Session_Start只在我访问MVC页面时被调用(例如HomeController)。

场景:我的WebApi控制器需要访问(正在进行)会话状态存储。我在Start_Session中访问Session State对象并将其缓存以供WebApi控制器使用。这工作正常,只要我首先访问单个MVC-Web-Page,但如果我首先访问WebApi,我的会话状态缓存不会被初始化,但显然是路由表,因此正在访问Global.asax。 / p>

此方案中有关初始化或会话状态访问的任何提示?我需要访问WebApi控制器而无需先访问网页...

谢谢! [R

2 个答案:

答案 0 :(得分: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);
}

答案 1 :(得分:2)

以下是ASP.NET上的论坛帖子 - Enabling Session,其中显示了如何使用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);
}

看起来这应该可以解决您的问题。