Вызов асинхронного вызова в веб-сервисе C # - PullRequest
2 голосов
/ 29 октября 2008

Я использую сторонний ресурс (.dll) в веб-сервисе, и моя проблема в том, что вызов этого ресурса (вызов метода) выполняется асинхронно - мне нужно подписаться на событие, чтобы получить ответ на мой запрос. Как мне это сделать в веб-сервисе c #?

Обновление:

Что касается Ответ Санни :

Я не хочу делать мой веб-сервис асинхронным.

Ответы [ 3 ]

2 голосов
/ 29 октября 2008

Предполагая, что ваш сторонний компонент использует шаблон модели асинхронного программирования, используемый в .NET Framework, вы можете сделать что-то вроде этого

    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();
    }

Поскольку для блокирования работы веб-службы необходимо использовать IAsyncResult.AsyncWaitHandle вместо обратного вызова для блокировки до завершения операции.

1 голос
/ 30 октября 2008

Если сторонний компонент не поддерживает стандартную модель асинхронного программирования (т.е. он не использует IAsyncResult), вы все равно можете добиться синхронизации, используя AutoResetEvent или ManualResetEvent. Для этого объявите поле типа AutoResetEvent в своем классе веб-службы:

AutoResetEvent processingCompleteEvent = new AutoResetEvent();

Затем дождитесь сигнала о событии после вызова стороннего компонента

// call 3rd party component
processingCompleteEvent.WaitOne()

И в обработчике события обратного вызова сигнализируют событие, чтобы позволить ожидающему потоку продолжить выполнение:

 processingCompleteEvent.Set()
0 голосов
/ 29 октября 2008

С MSDN документы :

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);
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...