Событие Global.asax, которое имеет доступ к состоянию сеанса - PullRequest
9 голосов
/ 28 марта 2012

Я пытаюсь получить доступ к состоянию сеанса в моем global.asax для каждого запроса (страницы, документы, PDF и т. Д.).Я знаю, что не могу сделать это в Application_BeginRequest, и я думал, что смогу в Application_AcquireRequestState, но это не сработает, что странно, потому что работает в другом проекте.

Итак, я ищусобытие, в котором у меня всегда будет доступ к состоянию сеанса для каждого запроса.

Спасибо

РЕДАКТИРОВАТЬ: @ Mike

Я пытался сделать это

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

Но я все еще получаю ошибки, поскольку у меня нет доступа к состоянию сеанса.

Ответы [ 4 ]

15 голосов
/ 28 марта 2012

Сессия загружается во время Application_AcquireRequestState. Ваша надежная ставка - построить Application_PreRequestHandlerExecute и получить к нему доступ.


Обновление: не каждый запрос имеет состояние сеанса. Вам также необходимо проверить на нулевое значение: if (System.Web.HttpContext.Current.Session != null).

7 голосов
/ 28 марта 2012

К исходному Request не будет привязано Session. Таким образом, вам нужно проверить, если Session не null:

var session = HttpContext.Current.Session;

if(session != null) {
    /* ... do stuff ... */
}
0 голосов
/ 13 октября 2017

На основе ввода из 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;
            }
        }
    }
}
0 голосов
/ 11 января 2016
If HttpContext.Current IsNot Nothing AndAlso HttpContext.Current.Session IsNot Nothing Then
strError = HttpContext.Current.Session("trCustomerEmail")
End If
...