15

Вопрос по async-await, asp.net-mvc-4 – Вызов ConfigureAwait из действия ASP.NET MVC

Я работал над презентацией и думал, что следующее не должно быть выполнено, поскольку ActionResult не возвращается в правильном контексте. Я проверил нагрузку с VS и не получил никаких ошибок. Я отладил его и знаю, что он переключает потоки. Похоже, это законный код.

Не волнует ли ASP.NET, в каком контексте или в каком потоке он похож на клиентское приложение? Если да, то какую цель обеспечивает AspNetSynchronizationContext? Я не чувствую себя правильно, помещая ConfigureAwait в само действие. Что-то не так в этом. Кто-нибудь может объяснить?

    public async Task<ActionResult> AsyncWithBackendTest()
    {
        var result = await BackendCall().ConfigureAwait(false);
        var server = HttpContext.Server;
        HttpContext.Cache["hello"] = "world";
        return Content(result);
    }

Правильный ответ должен либо сказать, почему это совершенно нормально, либо привести пример того, что не получается, если вы попробуете это. Моя интуиция говорит мне, что я не должен, но я хотел бы иметь факты, чтобы поддержать меня.

от Dan Friedman
2 ответа
4

В вашем коде

HttpContext является членом вашегоAsyncController Базовый класс. Это не текущий контекст для выполняющегося потока.

Кроме того, в вашем случае,HttpContext все еще действителен, так как запрос еще не завершен.

Я не могу проверить это в данный момент, но я ожидаю, что он потерпит неудачу, если вы использовалиSystem.Web.HttpContext.Current вместоHttpContext.

Постскриптум Безопасностьalways размножается, независимо отConfigureAwait - это имеет смысл, если вы думаете об этом. Я не уверен в культуре, но я не удивлюсь, если она тоже будет распространяться.

Error: User Rate Limit Exceeded

от Dan Friedman

Error: User Rate Limit Exceeded

от Dan Friedman

Error: User Rate Limit ExceededBackendCallError: User Rate Limit Exceeded

от 
6

ASP.NET не имеет «потока пользовательского интерфейса» нужно

что делают многие клиентские приложения (из-за структуры пользовательского интерфейса ниже). Этот контекст не о сродстве потока, а о отслеживании прогресса страницы (и других вещах, таких как перенос контекста безопасности для запроса).

Стивен Тауб упоминает об этом в статье MSDN:

Windows Forms isn't the only environment that provides a SynchronizationContext-derived class. ASP.NET also provides one, AspNetSynchronizationContext, though it's not public and is not meant for external consumption. Rather, it is used under the covers by ASP.NET to facilitate the asynchronous pages functionality in ASP.NET 2.0 (for more information, see msdn.microsoft.com/msdnmag/issues/05/10/WickedCode). This implementation allows ASP.NET to prevent page processing completion until all outstanding asynchronous invocations have been completed.

Немного подробнее о контексте синхронизации дано вСтатья Стивена Клири за прошлый год.

На фиг.4, в частности, показано, что она не имеет «конкретной нити». поведение WinForms / WPF, но все это отлично читается.

If multiple operations complete at once for the same application, AspNetSynchronizationContext will ensure that they execute one at a time. They may execute on any thread, but that thread will have the identity and culture of the original page.

Error: User Rate Limit Exceeded

от Dan Friedman

Похожие вопросы