Обработка сеанса в асинхронных методах

1

Я новичок в MVC5 и пытаюсь реализовать сеансы с помощью async-методов в контроллерах. Я создал такой метод

public async Task<ViewResult> Index()
{
    string currentUserId = User.Identity.GetUserId();
    var userId = Convert.ToInt64(HttpContext.Session["UserId"]);

    var userDetail = await service.GetBy(currentUserId),
}

Эта вещь сеанса всегда терпит неудачу со следующим сообщением

Ошибка сервера в приложении. Невозможно передать объект типа "System.Threading.Tasks.Task'1 [System.Int64]" для ввода "System.IConvertible".

(Извините, я не могу опубликовать снимок экрана с фактической ошибкой, так как на этом сайте недостаточно точек репутации)

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

var userId = await Task<long>.FromResult(Convert.ToInt64(HttpContext.Session["UserId"]));

а также

var userId = await (Session["UserId"] as Task<long>);

а также

var userId = await Convert.ToInt64(HttpContext.Session["UserId"]);

Но он всегда дает одно и то же сообщение. Может кто-нибудь, пожалуйста, укажите мне правильный подход. Кроме того, если мы не сможем использовать сеанс в методах async, то для чего это было бы лучшим решением.

  • 0
    Вы изменили код с Task<int> на Task<long> . Какой из них на самом деле не удалось для вас?
  • 0
    Это должно быть только Task <long>. Мое значение имеет тип Int64. Задача <int> была неверной
Теги:
async-await
session
asynchronous

1 ответ

7
Лучший ответ

Ошибка подразумевает, что HttpContext.Session["UserId"] хранит Task вместо фактического int64. Это означает, что где-то в вашем коде, где вы храните userId в сеансе, вы, вероятно, забываете ждать задачи для своего результата.

Вероятно, выглядит так:

HttpContext.Session["UserId"] = GetUserIdAsync();

Вместо:

HttpContext.Session["UserId"] = await GetUserIdAsync();

Вы также можете дождаться сохраненной задачи, как вы пытались сделать (с неправильным преобразованием типов):

var userId = await ((Task<Int64>)HttpContext.Session["UserId"]);
  • 1
    Спасибо за ответ. Это сработало для меня. Мне не хватало ключевого слова await при сохранении идентификатора пользователя в сеансе. Вот так HttpContext.Session ["UserId"] = await GetUserIdAsync (); Возможно, я посещал эту линию много раз, но так и не смог выяснить причину. Спасибо еще раз

Ещё вопросы

Сообщество Overcoder
Наверх
Меню