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.

Foi útil?

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);
  }
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top