Практическое руководство. Создание асинхронных методов веб-службы

Этот раздел посвящен технологии прежних версий. Веб-службы XML и клиенты веб-служб XML должны создаваться с использованием Windows Communication Foundation.

Эта процедура описывает преобразование метода веб-службы в пару методов, предназначенных для асинхронного доступа. Она следует принципам разработки асинхронной связи .NET Framework. В разделе Асинхронные методы XML-веб-служб разъясняется принцип действия этой процедуры, а также создания программой Wsdl.exe клиентских прокси-классов с возможностью асинхронного доступа к методам веб-службы, даже если они предназначены для синхронного доступа.

Реализация асинхронного метода веб-службы

  1. Разделите синхронный метод веб-службы на два метода с одинаковым базовым именем, у одного из которых имя начинается со слова Begin, а у другого — End.

  2. Список параметров для метода Begin содержит все параметры "in" и "by reference" для функциональных возможностей метода, а также два дополнительных параметра.

    • Параметры by reference указаны как параметры in.

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

    • Последний параметр — Object. Параметр Object позволяет вызвавшему объекту предоставить методу информацию о состоянии. Когда асинхронный метод веб-службы вызывает другой асинхронный метод, этот параметр можно передать последнему параметру этого метода.

    • Возвращаемое значение должно принадлежать к типу IAsyncResult.

  3. Список параметров метода End содержит IAsyncResult и параметры out и by reference, зависимые от функциональных возможностей метода.

    • Возвращаемое значение принадлежит к тому же типу, что и возвращаемое значение синхронного метода веб-службы.

    • Параметры by reference указаны как параметры out.

Пример

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 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 Web service.
        return remoteService.EndReturnedStronglyTypedDS(asyncResult);
    }
}
Imports System.Web.Services
<WebService(Namespace:="http://www.contoso.com/")> _
Public Class MyService
    Inherits WebService
    Public remoteService As RemoteService

    Public Sub New()
        MyBase.New()
        ' Create a new instance of proxy class for 
        ' the Web service to be called.
        remoteService = New RemoteService()
    End Sub

    ' Define the Begin method.
    <WebMethod()> _
    Public Function BeginGetAuthorRoyalties(ByVal Author As String, _
    ByVal callback As AsyncCallback, ByVal asyncState As Object) _
        As IAsyncResult
        ' Begin asynchronous communictation with a different XML Web
        ' service.
        Return remoteService.BeginReturnedStronglyTypedDS(Author, _
            callback, asyncState)
    End Function
    ' Define the End method.
    <WebMethod()> _
    Public Function EndGetAuthorRoyalties(ByVal asyncResult As _
        IAsyncResult) As AuthorRoyalties
        ' Return the asynchronous result from the other Web service.
        Return remoteService.EndReturnedStronglyTypedDS(asyncResult)
    End Function
End Class

См. также

Задачи

Как увязывать асинхронные вызовы с помощью метода веб-службы

Основные понятия

Асинхронные методы XML-веб-служб
Асинхронное взаимодействие с XML-веб-службами