【问题标题】: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);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-11-14
      • 2014-11-11
      • 2016-08-03
      • 2014-10-15
      • 2018-07-06
      • 2018-07-24
      • 2018-12-11
      • 2013-01-22
      相关资源
      最近更新 更多