Invocando chamada assíncrona em um serviço da web C#
-
05-07-2019 - |
Pergunta
Estou consumindo um recurso de terceiros (um .dll) em um serviço da web, e meu problema é que invocar esse recurso (chamando um método) é feito assíncrono - preciso me inscrever em um evento, para obter a resposta para meu pedido. Como faço isso no serviço AC# web?
Atualizar:
No que diz respeito aos Resposta de Sunny:
Não quero tornar meu serviço da web assíncrono.
Solução
Se o componente da terceira parte não suportar o modelo de programação assíncrona padrão (ou seja, ele não usa o IIAsyncresult), você ainda poderá obter a sincronização usando o AutoReretevent ou ManualReSetevent. Para fazer isso, declare um campo de tipo autoresetevent em sua classe de serviço da web:
AutoResetEvent processingCompleteEvent = new AutoResetEvent();
Em seguida, aguarde o sinalização do evento depois de ligar para o componente da terceira parte
// call 3rd party component
processingCompleteEvent.WaitOne()
E no manipulador de eventos de retorno de chamada sinaliza o evento para permitir que o tópico de espera continue a execução:
processingCompleteEvent.Set()
Outras dicas
Supondo
HttpWebRequest httpWebRequest = (HttpWebRequest)WebRequest.Create("http://www.stackoverflow.com");
IAsyncResult asyncResult = httpWebRequest.BeginGetResponse(null, null);
asyncResult.AsyncWaitHandle.WaitOne();
using (HttpWebResponse httpWebResponse = (HttpWebResponse)httpWebRequest.EndGetResponse(asyncResult))
using (StreamReader responseStreamReader = new StreamReader(httpWebResponse.GetResponseStream()))
{
string responseText = responseStreamReader.ReadToEnd();
}
Como você precisa da sua operação de serviço da Web para bloquear, use o IIAsyncresult.asyncwaithandle em vez do retorno de chamada para bloquear até que a operação seja concluída.
A partir de MSDN DOCs:
using System;
using System.Web.Services;
[WebService(Namespace="http://www.contoso.com/")]
public class MyService : WebService {
public RemoteService remoteService;
public MyService() {
// Create a new instance of proxy class for
// the XML Web service to be called.
remoteService = new RemoteService();
}
// Define the Begin method.
[WebMethod]
public IAsyncResult BeginGetAuthorRoyalties(String Author,
AsyncCallback callback, object asyncState) {
// Begin asynchronous communictation with a different XML Web
// service.
return remoteService.BeginReturnedStronglyTypedDS(Author,
callback,asyncState);
}
// Define the End method.
[WebMethod]
public AuthorRoyalties EndGetAuthorRoyalties(IAsyncResult
asyncResult) {
// Return the asynchronous result from the other XML Web service.
return remoteService.EndReturnedStronglyTypedDS(asyncResult);
}
}