asp.net mvc - Asincrónico HttpModule MVC
asp.net-mvc async-await (1)
De modo que tiene un código asíncrono en un controlador de eventos HttpModule síncrono, y ASP.NET arroja una excepción que indica que las operaciones asíncronas solo pueden iniciarse dentro de un controlador / módulo asíncrono. Me parece bastante sencillo.
Para solucionar esto, no debe suscribirse a BeginRequest
directamente; en su lugar, cree un "manejador" de recuperación de Task
, envuélvalo en EventHandlerTaskAsyncHelper
y páselo a AddOnBeginRequestAsync
.
Algo como esto:
private async Task ContextBeginRequest(object sender, EventArgs e)
{
HttpContext context = ((HttpApplication)sender).Context;
await ProcessImageAsync(context);
// Side note; if all you''re doing is awaiting a single task at the end of an async method,
// then you can just remove the "async" and replace "await" with "return".
}
y suscribirse:
var wrapper = new EventHandlerTaskAsyncHelper(ContextBeginRequest);
application.AddOnBeginRequestAsync(wrapper.BeginEventHandler, wrapper.EndEventHandler);
Tengo un HttpModule síncrono que contiene el siguiente código.
/// <summary>
/// Occurs as the first event in the HTTP pipeline chain of execution
/// when ASP.NET responds to a request.
/// </summary>
/// <param name="sender">The source of the event.</param>
/// <param name="e">An <see cref="T:System.EventArgs">EventArgs</see> that
/// contains the event data.</param>
private async void ContextBeginRequest(object sender, EventArgs e)
{
HttpContext context = ((HttpApplication)sender).Context;
await this.ProcessImageAsync(context);
}
Cuando intento ejecutar el módulo desde una aplicación MVC4 vacía (NET 4.5) aparece el siguiente error.
No se puede iniciar una operación asincrónica en este momento. Las operaciones asíncronas solo pueden iniciarse dentro de un controlador o módulo asíncrono o durante ciertos eventos en el ciclo de vida de la página. Si se produjo esta excepción al ejecutar una página, asegúrese de que la página esté marcada <% @ Page Async = "true"%>.
Me falta algo que parece, pero al leerlo, el error no debería ocurrir.
He tenido una búsqueda, pero parece que no puedo encontrar nada para ayudar, ¿alguien tiene alguna idea?