2014-11-26 4 views
1

Я использую следующий код для входа в веб-api. Я получаю нулевое исключение ссылки на FormsAuthentication.SetAuthCookie(authUser.UserId.ToString(), false); звонок. Пожалуйста, руководство меня, что я делаю неправильно ...null ошибка ссылки в task.run async метод

[AllowAnonymous] 
    [HttpPost] 
    public async Task<string> SignIn(JObject credentails) 
    { 
     string returnVal = ""; 

     await Task.Run(() => 
     { 
      string userName = (string)credentails.SelectToken("Username"); 
      string password = (string)credentails.SelectToken("Password"); 
      UserService userSvc = new UserService(new SqlConnection(_conStr)); 
      var authUser = userSvc.Authenticate(userName, password); 
      if (authUser != null) 
      { 
       FormsAuthentication.SetAuthCookie(userName, false); 
       HttpContext.Current.Session.Add("DR_CLIENT_ID", authUser.DRClientId); 
       HttpContext.Current.Session.Add("USER_ID", authUser.UserId); 
       returnVal = authUser.FullName; 
      } 
      else 
      { 
       throw new HttpResponseException(new HttpResponseMessage(HttpStatusCode.InternalServerError) 
       { 
        Content = new StringContent("Invalid Credentials!"), 
        ReasonPhrase = "Error" 
       }); 
      } 
     }); 
     return returnVal; 
    } 

ДОПОЛНЕНО-1 в этом случае значения не является на самом деле нулем, как я могу видеть его в режиме отладки. но когда я удаляю wait Task.Run (() = {}); блок из этого кода, он отлично работает без каких-либо проблем.

+0

, пожалуйста, заново рассмотрите, так как этот вопрос не связан с исключением ссылки на null и является основной нитью и фоновым потоком ... – Leo

+0

Хорошо. В следующий раз, пожалуйста, уточните, что вы все это проверили. Я не мог сказать по вашему вопросу. Кроме того, если есть один закрытый избиратель, используйте @username, чтобы отправить его. –

+1

'HttpContext.Current' будет null внутри задачи, что, вероятно, является причиной вашего исключения NullReferenceException. См. [Этот вопрос] (http://stackoverflow.com/questions/13748267/using-httpcontext-in-async-task) –

ответ

3

Проблема Task.Run. В ASP.NET, когда поступает входящий запрос, он назначает поток пула потоков для обработки этого запроса, и этот поток запускает ваш код. То, что делает ваш код, это использовать Task.Run, чтобы перейти на еще один thread thread thread без контекст запроса, а затем предполагает, что он имеет контекст запроса. FormsAuthentication.SetAuthCookieHttpContext.Current) просто не будет работать без контекста запроса.

Для решения проблемы удалите вызов Task.Run. Вы должны (почти) никогда не использовать Task.Run на ASP.NET.

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