我正在尝试访问global.asax中的每个请求(页面,文档,PDF等)的会话状态。我知道我不能在Application_BeginRequest中这样做,我认为我可以在Application_AcquireRequestState中,但它不会工作,这很奇怪,因为它适用于另一个项目。
所以,我正在寻找一个事件,我总是可以访问每个请求的会话状态。
由于
编辑:@Mike我试过这个
Sub Application_PreRequestHandlerExecute(ByVal sender As Object, ByVal e As EventArgs)
Session("test") = "test"
End Sub
但由于我无法访问会话状态,我仍然会收到错误。
答案 0 :(得分:15)
会话在Application_AcquireRequestState期间加载。您可以安全地建立Application_PreRequestHandlerExecute
并在那里访问它。
更新:并非每个请求都有会话状态。您还需要检查null:if (System.Web.HttpContext.Current.Session != null)
。
答案 1 :(得分:7)
最初的Request
不会绑定Session
。因此,您需要检查Session
是否不是null
:
var session = HttpContext.Current.Session;
if(session != null) {
/* ... do stuff ... */
}
答案 2 :(得分:0)
If HttpContext.Current IsNot Nothing AndAlso HttpContext.Current.Session IsNot Nothing Then
strError = HttpContext.Current.Session("trCustomerEmail")
End If
答案 3 :(得分:0)
基于input的Mike,这是我在Global.asax中使用我的工作代码的代码段:
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;
}
}
}
}