2012-07-17 74 views
1

我的MVC4(測試版)Azure WebRole具有用於WebApi訪問的控制器。這工作正常,除了一個小的catch:看起來Global.asax.cs Session_Start只在我訪問一個MVC頁面(例如HomeController)時被調用。未調用Azure MVC4(beta)WebApi Global.asax Session_Start? WebApi會話狀態訪問?

場景:我的WebApi控制器需要訪問(進行中)會話狀態存儲。我訪問Start_Session中的會話狀態對象並將其緩存以供WebApi控制器使用。這很好,只要我首先訪問一個MVC-Web-Page,但如果我先訪問WebApi,我的會話狀態緩存沒有初始化,但顯然路由表是,所以Global.asax被訪問。

在這種情況下初始化或會話狀態訪問的任何提示?我需要訪問WebApi控制器,而無需先訪問網頁...

謝謝! R

回答

4

在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); 
} 
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); 
} 

看起來像這樣應該可以解決你的問題。

+0

確實這樣做了。謝謝你的提示! – GGleGrand 2012-07-19 07:34:28