Как реализовать асинхронный клиент веб-службы с помощью ASP.NET 2.0
Этот раздел посвящен технологии прежних версий. Веб-службы XML и клиенты веб-служб XML должны создаваться с использованием Windows Communication Foundation.
В версии 2.0 платформы .NET Framework прокси-код, создаваемый инструментом Инструмент языка описания веб-служб (Wsdl.exe), поддерживает новую модель event-driven asynchronous programming model. Объединяя модель управляемого событиями асинхронного программирования и автоматическое создание прокси-класса веб-клиентов ASP.NET 2.0, можно быстро строить высокопроизводительные веб-приложения на основе веб-служб.
В разделе Multithreaded Programming with the Event-based Asynchronous Pattern приводятся вводные сведения о новой асинхронной модели программирования, в которой для обработки обратных вызовов используются события, что упрощает создание многопотоковых приложений без необходимости самостоятельной реализации сложного многопотокового кода. Общие сведения о новой управляемой событиями асинхронной модели см. в разделе Event-based Asynchronous Pattern Overview. Подробные сведения о реализациях клиентов с помощью новой модели см. в разделе How to: Implement a Client of the Event-based Asynchronous Pattern.
Клиенты веб-служб, созданные с помощью приложения ASP.NET в версии 2.0 платформы .NET Framework, могут использовать преимущества нового подкаталога App_WebReferences, который может динамически компилировать файл WSDL в прокси-код, когда клиентское приложение ASP.NET вызывает XML-веб-службу, поддерживающую контракт WSDL.
Полный пример см. в учебнике по RADAsync по ссылке ASP.NET Web Services QuickStarts.
Реализация управляемого событиями клиента веб-службы
Создайте XML-веб-службу с синхронным веб-методом, выполняющим требующее много времени действие, которое лучше всего выполнять асинхронно.
[WebMethod] public string HelloWorld() { Thread.Sleep(5000); return "Hello World"; }
<WebMethod()> _ Public Function HelloWorld() As String Thread.Sleep(5000) ..Return "Hello World" End Function
В клиентском приложении ASP.NET добавьте атрибут Async к вашей директиве @ Page и задайте для него значение true, затем используйте директиву @ Import для импорта пространства имен
System.Threading
.<%@ Page Language="C#" Debug="true" Async="true" %> <%@ Import Namespace="System.Threading" %>
<%@ Page Language="VB" Debug="true" Async="true" %> <%@ Import Namespace="System.Threading" %>
Чтобы использовать автоматическое создание прокси-класса, создайте файл WSDL (с помощью инструмента Инструмент языка описания веб-служб (Wsdl.exe)) и поместите этот файл в подкаталог App_WebReferences клиента. (Дополнительные сведения см. в разделе ASP.NET Web Site Layout.)
Обычным образом постройте клиента веб-службы, создав новый объект с помощью имени класса службы плюс строка
WaitService
и присвойте URL-адрес веб-службы свойству Url. Например, в случае имени класса службыHelloWorld
клиент создает объектHelloWorldWaitService
.HelloWorldWaitService service = new HelloWorldWaitService(); service.Url = "https://localhost/QuickStartv20/webservices/Samples/RADAsync/cs/Server/HelloWorldWaitService.asmx";
Dim service As New HelloWorldWaitService() service.Url = "https://localhost/QuickStartv20/webservices/Samples/RADAsync/vb/Server/HelloWorldWaitService.asmx"
В коде клиентского приложения присвойте обработчик событий событию Completed своего прокси-класса. В следующем примере кода клиентская страница ASP.NET имеет метод
HelloWorldCompleted
, вызываемый при возврате метода веб-службы.//Add our callback function to the event handler. service.HelloWorldCompleted += this.HelloWorldCompleted;
'Add our callback function to the event handler AddHandler service.HelloWorldCompleted, AddressOf Me.HelloWorldCompleted
В коде клиентского приложения вызовите метод Async для прокси-класса. (Этот метод имеет то же имя, что и веб-метод, но с добавленным текстом "Async". Дополнительные сведения см. в разделе How to: Implement a Client of the Event-based Asynchronous Pattern.) Этот вызов метода появляется на клиентской странице ASP.NET в виде синхронного вызова, но управление возвращается немедленно. Клиентская страница ASP.NET возвращается в браузер только после того, как будет завершен асинхронный вызов, возникнет событие прокси-класса Completed и будет выполнен метод обработчика.
service.HelloWorldAsync("second call");
service.HelloWorldAsync("second call")