【问题标题】:Global.asax event that has access to session state有权访问会话状态的 Global.asax 事件
【发布时间】:2012-03-27 20:23:20
【问题描述】:

我正在尝试访问我 global.asax 中每个请求(页面、文档、PDF 等)的会话状态。我知道我不能在 Application_BeginRequest 中执行此操作,并且我认为我可以在 Application_AcquireRequestState 中执行此操作,但是它不起作用,这很奇怪,因为它在另一个项目中起作用。

所以,我正在寻找一个事件,在该事件中我总是可以访问每个请求的会话状态。

谢谢

编辑:@迈克

我试过这样做

Sub Application_PreRequestHandlerExecute(ByVal sender As Object, ByVal e As EventArgs)
    Session("test") = "test"
End Sub

但由于无法访问会话状态,我仍然会收到错误消息。

【问题讨论】:

    标签: asp.net session-state global-asax


    【解决方案1】:

    在 Application_AcquireRequestState 期间加载会话。安全的选择是构建 Application_PreRequestHandlerExecute 并在那里访问它。


    更新:并非每个请求都有会话状态。您还需要检查 null:if (System.Web.HttpContext.Current.Session != null)

    【讨论】:

      【解决方案2】:

      最初的Request 不会有Session 与之绑定。因此,您需要检查Session 是否不是null

      var session = HttpContext.Current.Session;
      
      if(session != null) {
          /* ... do stuff ... */
      }
      

      【讨论】:

      • 它似乎正在工作,但如果我能找到更好的东西,那就太好了。谢谢
      • 感谢关于初始会话的建议!
      【解决方案3】:

      基于Mikeinput,这是我在 Global.asax 中的工作代码的 sn-p:

      namespace WebApplication
      {
          public class MvcApplication : System.Web.HttpApplication
          {
              protected void Application_Start()
              {
                   /* ... */
              }
      
              protected void Application_PreRequestHandlerExecute(Object sender, EventArgs e)
              {
                  if (HttpContext.Current.Session != null && HttpContext.Current.Session["isLogged"] != null && (bool)HttpContext.Current.Session["isLogged"])
                  {
                      HttpContext.Current.User = (LoginModel)HttpContext.Current.Session["LoginModel"];
                  }
              }
          }
      }
      

      在控制器中:

      namespace WebApplication.Controllers
      {
          [Authorize]
          public class AccountController : Controller
          {
              /* ... */
      
              [HttpPost]
              [AllowAnonymous]
              [ValidateAntiForgeryToken]
              public async Task<ActionResult> Login(LoginModel model, string returnUrl)
              {
                  if (!ModelState.IsValid)
                  {
                      return View(model);
                  }
      
                  // Don't do this in production!
                  if (model.Username == "me") {
                      this.Session["isLogged"] = true;
                      this.Session["LoginModel"] = model;
                  }
              }
          }
      }
      

      【讨论】:

        【解决方案4】:
        If HttpContext.Current IsNot Nothing AndAlso HttpContext.Current.Session IsNot Nothing Then
        strError = HttpContext.Current.Session("trCustomerEmail")
        End If
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-07-16
          • 2012-04-04
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-02-01
          • 2014-02-01
          • 2019-01-27
          相关资源
          最近更新 更多