我的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
答案 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);
}
看起来这应该可以解决您的问题。