Вызов асинхронного вызова в веб-службе C #
-
05-07-2019 - |
Вопрос
Я использую сторонний ресурс (.dll) в веб-службе, и моя проблема в том, что вызов этого ресурса (вызов метода) выполняется асинхронно - мне нужно подписаться на событие, чтобы получить ответ на мой запрос.Как мне сделать это в веб-сервисе c #?
Обновить:
В отношении Ответ Солнышка:
Я не хочу делать свой веб-сервис асинхронным.
Решение
Если сторонний компонент не поддерживает стандартную модель асинхронного программирования (т.е. он не использует IAsyncResult), вы все равно можете добиться синхронизации с помощью AutoResetEvent или ManualResetEvent.Чтобы сделать это, объявите поле типа AutoResetEvent в вашем классе веб-сервиса:
AutoResetEvent processingCompleteEvent = new AutoResetEvent();
Затем дождитесь сигнала о событии после вызова стороннего компонента
// call 3rd party component
processingCompleteEvent.WaitOne()
И в обработчике события обратного вызова сигнализируйте событию, чтобы ожидающий поток продолжил выполнение:
processingCompleteEvent.Set()
Другие советы
Предполагая, что ваш сторонний компонент использует шаблон модели асинхронного программирования, используемый во всей .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 вместо обратного вызова для блокировки до завершения операции.
От Документы 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);
}
}