Necesito llamar a algunas operaciones asíncronas en mi base de datos en Global.asax. por ejemplo en Application_AuthenticateRequest Necesito autenticar usuario contra DB ¿Es posible con tareas asincrónicas?ASP.NET: ¿Es posible llamar a la tarea asincrónica en Global.asax?
Respuesta
No encontré la manera de utilizar la nueva palabra clave C# async y espero, pero aún podemos usar el patrón APM para usar operaciones asincrónicas en Global.asax porque implementó la interfaz IHttpAsyncHandler. Aquí hay un pequeño código para demostración asíncrona, aquí utilizo un WebRequst como ejemplo, en su caso use la operación de la base de datos.
public Global()
{
this.AddOnAuthenticateRequestAsync(BeginGetAsyncData, EndGetAsyncData);
}
IAsyncResult BeginGetAsyncData(Object src, EventArgs args, AsyncCallback cb, Object state)
{
Console.WriteLine("BeginGetAsyncData: thread #" + System.Threading.Thread.CurrentThread.ManagedThreadId);
WebRequest request = WebRequest.Create("http://www.google.com");
return request.BeginGetResponse(cb, request); // call database async operation like SqlCommand.BeginExecuteReader()
}
void EndGetAsyncData(IAsyncResult ar)
{
Console.WriteLine("EndGetAsyncData: thread #" + System.Threading.Thread.CurrentThread.ManagedThreadId);
WebRequest requst = (WebRequest)ar.AsyncState;
System.Net.WebResponse response = requst.EndGetResponse(ar); // call database async operation like SqlCommand.EndExecuteReader()
Console.WriteLine(new StreamReader(response.GetResponseStream()).ReadToEnd());
response.Close();
}
¡Gracias! He encontrado :) [http://www.codeproject.com/Articles/373479/Writing-asynchronous-HTTP-Module-in-ASP-NET-4-5](http://www.codeproject. com/Articles/373479/Writing-asynchronous-HTTP-Module-in-ASP-NET-4-5) – user1328761
Tiene que agregar la versión asincrona de AuthenticateRequest. Usando el siguiente código:
public MvcApplication()
{
// Contrary to popular belief, this is called multiple times, one for each 'pipeline' created to handle a request.
// Wire up the async authenticate request handler.
AddOnAuthenticateRequestAsync(BeginAuthenticateRequest, EndAuthenticateRequest, null);
}
La cuestión es entonces, cómo implementar y BeginAuthenticateRequest
EndAuthenticateRequest
utilizando el nuevo asíncrono/espera de características de C#. En primer lugar, vamos a obtener nuestra versión asíncrona de AuthenticateRequest fuera del camino:
private async Task AuthenticateRequestAsync(object sender, EventArgs args)
{
// Yay, let's do async stuff!
await ...
}
Lo que tenemos que hacer ahora es llegar a una implementación de BeginAuthenticateRequest y EndAuthenticateRequest. Seguí a blog post, embargo, a partir de mi propia aplicación:
private IAsyncResult BeginAuthenticateRequest(object sender, EventArgs args, AsyncCallback callback, object state)
{
Task task = AuthenticateRequestAsync(sender, args);
var tcs = new TaskCompletionSource<bool>(state);
task.ContinueWith(_ =>
{
if (task.IsFaulted && task.Exception != null) tcs.TrySetException(task.Exception.InnerExceptions);
else if (task.IsCanceled) tcs.TrySetCanceled();
else tcs.TrySetResult(true);
if (callback != null) callback(tcs.Task);
}, CancellationToken.None, TaskContinuationOptions.None, TaskScheduler.Default);
return tcs.Task;
}
Usted puede leer todo el artículo enlazado para ver cómo funciona, pero básicamente IAsyncResult
es implementado por el Grupo, así que todo lo que tiene que hacer es llamar a la devolución de llamada cuando se hace .
La última parte es fácil de muertos:
private void EndAuthenticateRequest(IAsyncResult result)
{
// Nothing to do here.
}
Hay una manera más fácil de hacer esto ahora:
public MvcApplication()
{
var wrapper = new EventHandlerTaskAsyncHelper(DoAsyncWork);
this.AddOnAuthenticateRequestAsync(wrapper.BeginEventHandler, wrapper.EndEventHandler);
}
private async Task DoAsyncWork(object sender, EventArgs e)
{
var app = (HttpApplication)sender;
var ctx = app.Context;
...
await doSomethingAsync();
}
Con este enfoque, se define un método que utiliza la palabra clave asíncrono y envolver ese método utilizando la clase 'EventHandlerTaskAsyncHelper' para generar los métodos BeginEventHandler y EndEventHandler para pasar a la llamada AddOnAuthenticateRequestAsync.
- 1. ¿Es posible depurar Global.asax?
- 2. ¿Es posible llamar a la tarea ant desde una tarea javascript scriptdef?
- 3. ¿Es posible la llamada jdbc asincrónica?
- 4. Asp.net System.Web.HttpContext.Current.Session null en global.asax
- 5. sesión de ASP.NET en Global.asax
- 6. ASP.NET MVC no llama a global.asax 'EndRequest
- 7. ASP.NET global.asax uso
- 8. manejo Application_Error en ASP.NET global.asax de la aplicación ASP.NET
- 9. ¿Es posible actualizar de manera asincrónica el aviso de PowerShell?
- 10. android.os.NetworkOnMainThreadException. ¿Necesita usar una tarea asincrónica?
- 11. ¿Cuál es el propósito de global.asax en asp.net
- 12. Descripción del enrutamiento en Global.asax (asp.net-mvc)
- 13. Manejo de excepciones en global.asax ASP.NET MVC
- 14. ASP.NET ¿Es posible llamar a métodos dentro de Server Tag usando Eval()?
- 15. ¿Es una mejor práctica llamar a los métodos de forma asincrónica utilizando delegados?
- 16. Android tarea asincrónica ralentizando mi interfaz de usuario Subproceso
- 17. ¿Es posible llamar a script ejecutable Thor-powered sin llamar a thor?
- 18. ¿Es posible llamar a un servicio web con Indesign javascript?
- 19. ¿Es posible llamar a un módulo de Python desde ObjC?
- 20. Application_Start() evento en global.asax
- 21. ¿Por qué HttpContext.Current.Session es nulo en Global.asax?
- 22. Ubuntu + Mono + ASP.NET, ¿es posible?
- 23. Cómo llamar a la función en el temporizador ASP.NET MVC
- 24. ¿Es posible llamar a una función que no está en la ruta en MATLAB?
- 25. Cómo prevenir la prueba de Rake para llamar a la tarea db: test: prepare
- 26. ASP.NET: variable de sesión de acceso en global.asax
- 27. ¿Es posible realizar una tarea de Rake interactiva?
- 28. Accediendo a RequestContext desde global.asax
- 29. NSURLCincronización asincrónica en un hilo separado no puede llamar a los métodos de delegado
- 30. Llamar a un procedimiento almacenado con asp.net
¿Por qué quiere autenticarse de forma asíncrona? ¿No debería hacerse eso sincrónicamente? – Rich
porque en muchas solicitudes de usuario, sychronouse llama a DB para que otros requers se coloquen en la cola, esto aumenta el tiempo de respuesta. consulte [Llamadas asíncronas de base de datos con el modelo de programación asíncrono basado en tareas (TAP) en ASP.NET MVC 4] (http://www.tugberkugurlu.com/archive/asynchronous-database-calls-with-task-based-asynchronous -programación-modelo-tap-en-asp-net-mvc-4) – user1328761
Hemos logrado aumentar nuestro rendimiento manejando AuthenticateRequest de forma asíncrona. No es necesario que el hilo sea bloqueado por la red. –