【问题标题】:Azure MVC4(beta) WebApi Global.asax Session_Start not called? WebApi Session State Access?未调用 Azure MVC4(测试版)WebApi Global.asax Session_Start? WebApi 会话状态访问?
【发布时间】:2012-07-16 19:18:57
【问题描述】:
我的 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 控制器...
谢谢!
回复
【问题讨论】:
标签:
asp.net-mvc-4
session-state
asp.net-web-api
【解决方案1】:
这是 ASP.NET 上的论坛帖子 - Enabling Session,展示了如何使用 PostAuthorizeRequest 方法为 WebApi 调用启用会话状态。我在 Global.asax 文件的修改下包含了代码 sn-p 供您参考。
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);
}
看起来这应该可以解决您的问题。
【解决方案2】:
在 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);
}