2016-12-19 3 views
0

Я просто хочу получить свой ApplicationUser в MVC. Я пытаюсь этот код:Получить результат System.Threading.Tasks.Task (ApplicationUser MVC)

public async System.Threading.Tasks.Task<ApplicationUser> GetApplicationUser() 
    { 
     return await _userManager.GetUserAsync(HttpContext.User); 
    } 

    var user = GetApplicationUser(); 
    var user2 = user.Result; 

Однако, когда я пытаюсь получить доступ к user.Result я получаю Exception

"One or more errors occurred. (Object reference not set to an instance of an object.)" 
"Object reference not set to an instance of an object." 

Не уверен, как получить доступ к результату.

ответ

0

Из кода вы публикуемый (без каких-либо подробностей исключения), я бы догадаться, что проблема заключается в том, что _userManager является null.

Однако вы столкнетесь с другой проблемой, если исправите это. В частности, вы должны использовать await вместо Result; the latter can cause deadlocks.

+0

userManager не равно нулю, и я дал сведения об исключении, которые я получил. Как использовать ожидание вместо .Result? Я попробовал var user = ждать GetApplicationUser(); но получить ошибку, что это не async, даже если это так. Благодарю. –

+0

@ClaySmith: Вы должны опубликовать трассировку стека исключения - это скажет вам хотя бы * где * это происходит. Сообщение об ошибке, которое вы получаете относительно 'async', связано с тем, что метод * call * не является асинхронным. Иными словами, чтобы использовать 'await', вы должны быть в методе' async', поэтому вам нужно будет изменить этот метод как 'async'. –

0

Убедитесь, что контроллер действия aync задач, например, так:

public async Task<IActionResult> Test() 
    {    
     ApplicationUser user = await GetCurrentUserAsync(); 
     if (user != null) { 
      // do more stuff here 
     } 
     // do more stuff here 
     return View();    
    } 

    private Task<ApplicationUser> GetCurrentUserAsync() 
    { 
     return _userManager.GetUserAsync(HttpContext.User); 
    } 
-2

мне пришлось вызвать функцию .Wait() вручную, а затем я могу получить доступ к .Result успешно. Кроме того, мой HttpContext был пустой, так что я должен был использовать его внутри индекса() как

public IActionResult Index() 
    { 
     DoSomethingWith(HttpContext); 
     return View(); 
    } 

и

  System.Threading.Tasks.Task<ApplicationUser> user = GetApplicationUser(context); 
      user.Wait(); 
      var user2 = user.Result; 
+0

Не очень красивое решение. Вы попробовали вместо этого предлагаемую публичную асинхронную задачу Index() – Ross