Почему HttpContext.Current null после ожидания?

У меня есть следующий тестовый код WebAPI, я не использую WebAPI в производстве, но я сделал это из-за обсуждения, которое у меня было по этому вопросу: вопрос WebAPI Async

В любом случае, вот оскорбительный метод WebAPI:

public async Task Get(int id) { var x = HttpContext.Current; if (x == null) { // not thrown throw new ArgumentException("HttpContext.Current is null"); } await Task.Run(() => { Task.Delay(500); id = 3; }); x = HttpContext.Current; if (x == null) { // thrown throw new ArgumentException("HttpContext.Current is null"); } return "value"; } 

Я полагал, что второе исключение ожидается, потому что, когда ожидание завершится, оно, скорее всего, будет в другом streamе, где HttpContext.Current как поточно-статическая переменная больше не будет разрешать соответствующее значение. Теперь, основываясь на контексте синхронизации, на самом деле его можно заставить вернуться в тот же stream после ожидания, но я не делаю ничего необычного в своем тесте. Это простое, наивное использование await .

В комментариях в другом вопросе мне сказали, что HttpContext.Current должен решить после ожидания. Есть еще один комментарий по этому вопросу, указывающий на то же самое. Так что же верно? Должен ли он разрешаться? Я думаю, нет, но я хочу получить авторитетный ответ на это, потому что async и await достаточно новый, что я не могу найти ничего определенного.

TL; DR: Является ли HttpContext.Current потенциально null после await ?

Убедитесь, что вы пишете приложение ASP.NET 4.5 и таргетинг на 4.5. async и await неопределенного поведения на ASP.NET, если вы не используете 4.5 и используете новый «удобный для пользователя» контекст синхронизации.

В частности, это означает, что вы должны:

  • Установите httpRuntime.targetFramework в 4.5 или
  • В appSettings установите aspnet:UseTaskFriendlySynchronizationContext в true .

Более подробная информация доступна здесь .

Поскольку @StephenCleary правильно указал, вам это нужно в вашем web.config:

  

Когда я впервые устранил эту проблему, я сделал поиск решения для всего выше, подтвердил, что он присутствует во всех моих веб-проектах и ​​быстро отклонил его как виновника. В конце концов мне пришло в голову рассмотреть эти результаты поиска в полном контексте:

  

Doh.

Урок. Если вы обновляете веб-проект до версии 4.5, вам все равно нужно установить эту настройку вручную.

Является ли мой тест некорректным или есть какой-то элемент web.config, который я здесь отсутствует, что приведет к правильному разрешению HttpContext.Current после ожидания?

Ваш тест не является недостатком, и HttpContext.Current не должен быть нулевым после ожидания, потому что в ASP.NET Web API, когда вы ждете, это гарантирует, что код, следующий за этим ожиданием, будет передан правильный HttpContext, который присутствовал до ожидания.

  • Вектор векторов для создания матрицы
  • Есть ли причина использовать это->
  • ULL-суффикс на числовом литерале
  • Каковы правила для токена «...» в контексте вариативных шаблонов?
  • В clang, как вы используете атрибуты оптимизации для каждой функции?
  • Как десериализовать JSON с двойными именами свойств в одном и том же объекте
  • Неопределенная ссылка на статическую переменную c ++
  • Является ли умножение и деление с использованием операторов сдвига в C на самом деле быстрее?
  • Как инициализировать поле const в конструкторе?
  • Что означает символ \ 0 в строке C?
  • Запустить консольное приложение из другого консольного приложения
  • Interesting Posts

    ADB не найдено устройств

    Как объявить переменную, которая имеет тип и реализует протокол?

    Коммуникация между fragmentом и активностью – лучшие практики

    Дата метода DateFormatter (from: String) возвращает nil для определенных дат на определенных языках в Swift

    Какая связь между установками UIViewNeedsLayout, layoutIfNeeded и layoutSubviews?

    Используют ли GPG и GPGSM одну и ту же базовую базу данных?

    Как получить выбранные элементы списка из списка с помощью checkbox и пользовательского адаптера?

    Путь к файлу txt для Android

    Java – загрузка DLL по относительному пути и скрыть их внутри банки

    Изменить фон ProgressDialog

    Самый эффективный способ удаления специальных символов из строки

    ионное приложение не может подключить сервер с поддержкой cors с помощью $ http

    OutOfMemoryError: размер растрового изображения превышает бюджет VM: – Android

    Как ограничить использование процессора и диска rm, чтобы другие программы оставались функциональными

    глобальная переменная в C статична или нет?

    Давайте будем гением компьютера.