1

我的 MVC4(beta) Azure WebRole 具有用于 WebApi 访问的控制器。这工作正常,除了一个小问题:似乎 Global.asax.cs Session_Start 仅在我访问 MVC 页面(例如 HomeController)时被调用。

场景:我的 WebApi 控制器需要访问(进行中的)会话状态存储。我访问 Start_Session 中的 Session State 对象并将其缓存以供 WebApi 控制器使用。这很好用,只要我先访问一个 MVC-Web-Page,但是如果我先访问 WebApi,我的 Session State 缓存没有初始化,但显然路由表是,所以 Global.asax 正在被访问。

在这种情况下,有关初始化或会话状态访问的任何提示?我需要在不首先访问网页的情况下访问 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 回答