2015-01-16 4 views
1

Я пытаюсь использовать сеанс, но когда я вызываю метод SetSession, я вижу, что HttpContext.Current имеет значение null, поэтому я получаю MinValue (из gettor, поскольку свойство session равно null) как решить эту проблему? из-за этого, каждый раз, когда я пытаюсь получить переменные сессии, она не работает, на самом деле = D это выглядит, я что-то забыл, но ...Как использовать сеанс с HttpContext.Current at null

От контроллера я называю SessionManager, когда пользователь подключается:

менеджер
var result = await SignInManager.PasswordSignInAsync(model.Email, model.Password, model.RememberMe, shouldLockout: false); 
      switch (result) 
      { 
       case SignInStatus.Success: 
        { 
         var identityUser = UserManager.FindByEmail(model.Email); 

         if (identityUser.Matricule.IsNotNull() && !identityUser.Matricule.HasValue) 
         { 
          SetAlert("Error"); 
         } 
         else 
         { 
          SessionManager.matricule = identityUser.Matricule.Value; 

          var user = BL.PersonnelBL.GetAll(SessionManager.matricule); 
          SessionManager.firstName = user.prenom; 
          SessionManager.lastName = user.nom; 
          SessionManager.chainId = user.chaine.chaine; 
          SessionManager.secteurId = user.chaine.secteur.Id; 
          SessionManager.serviceId = user.chaine.service.Id; 
          SessionManager.isAuditor = user.auditTarget.IsNull() ? false : true; 
         } 

         // Redirect to local 
         return RedirectToLocal(returnUrl); 
        } 
       case SignInStatus.LockedOut: 
        return View("Lockout"); 
       case SignInStatus.RequiresVerification: 
        return RedirectToAction("SendCode", new { ReturnUrl = returnUrl }); 
       case SignInStatus.Failure: 
       default: 
        ModelState.AddModelError("", "Invalid login attempt."); 
        return View(model); 
      } 

сессия:

public class SessionManager 
    { 
    public static int matricule 
      { 
       get 
       { 
        object property = GetSession("MATRICULE"); 
        if (property != null) 
        { 
         return Convert.ToInt32(property); 
        } 
        return int.MinValue; 
       } 
       set 
       { 
        SetSession("MATRICULE", value); 
       } 
      } 
} 
private static bool SetSession(string key, object value) 
     { 
      if (HttpContext.Current != null && HttpContext.Current.Session != null) 
      { 
       HttpContext.Current.Session[key] = value; 
       return true; 
      } 
      return false; 
     } 

Внутри Web.Config:

<system.web> 
... 
<sessionState mode="InProc" timeout="45" /> 
</system.web> 

Т мотки заранее

+0

включить сеансы. Если HttpContext.Current имеет значение NULL, то вы, вероятно, не делаете этого в активном сеансе, я имею в виду, когда нет активного запроса. Вы выполняете параллельную обработку? – hazimdikenli

+0

Где этот код выполняется? Внутри контроллера есть служба? –

+0

Вы используете это в отдельной задаче/потоке? HttpContext.Current не копируется на рабочие потоки IIRC. –

ответ

1

Есть несколько причин, ваш HttpContext.Current может быть null:

Вы работаете этот код:

  • в Task или других фоновом потоке;
  • от Session_End событие;
  • в HttpModule или HttpHandler, который не поддерживает сеансы (см. Интерфейс флага IRequiresSessionState).
+0

Спасибо. См. Мой вопрос, я добавил больше кода. Я не использовал Task и Session_End. Должен ли я реализовать HttpModule на моем Sessionmanager, чтобы заставить сеанс работать с ним? Спасибо – clement

+0

Можете ли вы показать код, вызывающий 'matricule'? –

+0

Действительно, с контроллера: var matricule = SessionManager.matricule; – clement

Смежные вопросы