2010-08-27 20 views
6

Necesito llamar a un servicio web de manera asilica desde una aplicación ASP.NET. El aspx no necesita la respuesta del servicio web. Es solo una notificación simple.Cómo llamar asincrónicamente un servicio web desde una aplicación ASP.NET?

Estoy usando el método ...Async() desde el stub del servicio web y <%@Page Async="True" %>.

ws.HelloWorldAsync(); 

Mi problema: la solicitud de la página web está esperando la respuesta del servicio web.

¿Cómo solucionar este problema? ¿Cómo evitar cualquier fuga de recursos cuando el servicio web está caído o cuando hay una sobrecarga?

Respuesta

0

En su escenario, puede usar ThreadPool ThreadPool.QueueUserWorkItem (...) para llamar al servicio web en un subproceso agrupado.

0

He utilizado hilos simples para hacer esto antes. por ejemplo:

Thread t = new Thread(delegate() 
{ 
    ws.HelloWorld(); 
}); 
t.Start(); 

El hilo continuará ejecutándose después de que el método haya retornado. Mirando a su alrededor, parece que el enfoque de ThreadPool isn't always recommended

+0

Entendí que el uso de ThreadPool interferirá con la ejecución de ASP.NET. Pero la creación de muchos hilos reducirá el rendimiento de toda la aplicación web. – Jorge

0

Comenzar un nuevo hilo es probablemente la solución más fácil, ya que no le importa recibir una notificación del resultado.

new Thread(() => ws.HelloWorld()).Start 
1

Un proxy de servicio web normalmente también tiene un método Begin y End. Puedes usar estos. El siguiente ejemplo muestra cómo puede llamar al método begin y usar una devolución de llamada para completar la llamada. La llamada a MakeWebServiceAsynCall se devolvería de inmediato. La declaración de uso se asegurará de que el objeto se elimine de forma segura.

void MakeWebServiceAsynCall() 
    { 
     WebServiceProxy proxy = new WebServiceProxy(); 
     proxy.BeginHelloWorld(OnCompleted, proxy); 
    } 
    void OnCompleted(IAsyncResult result) 
    { 
     try 
     { 
      using (WebServiceProxy proxy = (WebServiceProxy)result.AsyncState) 
       proxy.EndHelloWorld(result); 
     } 
     catch (Exception ex) 
     { 
      // handle as required 
     } 
    } 

Si necesita saber si la llamada fue exitosa o no, tendrá que esperar el resultado.

Cuestiones relacionadas