HOW TO:鏈結非同步呼叫與 Web 服務方法
本主題專門說明舊有技術。 應該使用下列建立 XML Web Service 及 XML Web Service 用戶端: Windows Communication Foundation.
下列程式碼範例示範當 Web 服務方法進行一次以上的非同步呼叫,而這些呼叫必須循序執行時,如何鏈結非同步呼叫。BeginGetAuthorRoyalties
方法會進行非同步呼叫來判斷傳入的作者是否有效,然後設定名為 AuthorRoyaltiesCallback
的中繼回呼 (Intermediate Callback) 以接收結果。如果作者有效,這個中繼回呼便會進行非同步呼叫以取得該作者的版稅。
範例
using System.Web.Services;
using System.Data;
using System;
// This imports the proxy class for the Web services
// that the sample communicates with.
using AsyncWS.localhost;
namespace AsyncWS
{
[WebService(Namespace="https://www.contoso.com/")]
public class MyService : System.Web.Services.WebService
{
public RemoteService remoteService;
public MyService()
{
remoteService = new RemoteService();
}
[WebMethod]
public IAsyncResult BeginGetAuthorRoyalties(String Author,
AsyncCallback callback, Object asyncState)
{
// Saves the current state for the call that gets the author's
// royalties.
AsyncStateChain state = new AsyncStateChain();
state.originalState = asyncState;
state.Author = Author;
state.originalCallback = callback;
// Creates an intermediary callback.
AsyncCallback chainedCallback = new
AsyncCallback(AuthorRoyaltiesCallback);
return remoteService.BeginGetAuthors(chainedCallback,state);
}
// Intermediate method to handle chaining the
// asynchronous calls.
public void AuthorRoyaltiesCallback(IAsyncResult ar)
{
AsyncStateChain state = (AsyncStateChain)ar.AsyncState;
RemoteService rs = new RemoteService();
// Gets the result from the call to GetAuthors.
Authors allAuthors = rs.EndGetAuthors(ar);
Boolean found = false;
// Verifies that the requested author is valid.
int i = 0;
DataRow row;
while (i < allAuthors.authors.Rows.Count && !found)
{
row = allAuthors.authors.Rows[i];
if (row["au_lname"].ToString() == state.Author)
{
found = true;
}
i++;
}
if (found)
{
AsyncCallback cb = state.originalCallback;
// Calls the second Web service, because the author is
// valid.
rs.BeginReturnedStronglyTypedDS(state.Author,cb,state);
}
else
{
// Cannot throw the exception in this function or the XML Web
// service will hang. So, set the state argument to the
// exception and let the End method of the chained XML Web
// service check for it.
ArgumentException ex = new ArgumentException(
"Author does not exist.","Author");
AsyncCallback cb = state.originalCallback;
// Call the second Web service, setting the state to an
// exception.
rs.BeginReturnedStronglyTypedDS(state.Author,cb,ex);
}
}
[WebMethod]
public AuthorRoyalties EndGetAuthorRoyalties(IAsyncResult
asyncResult)
{
// Check whehter the first Web service threw an exception.
if (asyncResult.AsyncState is ArgumentException)
throw (ArgumentException) asyncResult.AsyncState;
else
return remoteService.EndReturnedStronglyTypedDS(asyncResult);
}
}
// Class to wrap the callback and state for the intermediate
// asynchronous operation.
public class AsyncStateChain
{
public AsyncCallback originalCallback;
public Object originalState;
public String Author;
}
}
Imports System.Web.Services
Imports System.Data
Imports System
' This imports the proxy class for the Web services
' that the sample communicates with.
Imports AsyncWS_VB.localhost
Namespace AsyncWs
<WebService(Namespace:="https://www.contoso.com/")> _
Public Class MyService
Inherits WebService
Public remoteService As remoteService
Public Sub New()
MyBase.New()
remoteService = New localhost.RemoteService()
End Sub
' Defines the Begin method.
<WebMethod()> _
Public Function BeginGetAuthorRoyalties(ByVal Author As String, _
ByVal callback As AsyncCallback, ByVal asyncState As Object) _
As IAsyncResult
' Saves the current state for the call that gets the author's
' royalties.
Dim state As AsyncStateChain = New AsyncStateChain()
state.originalState = asyncState
state.Author = Author
state.originalCallback = callback
' Creates an intermediary callback.
Dim chainedCallback As AsyncCallback = New AsyncCallback( _
AddressOf AuthorRoyaltiesCallback)
' Begin asynchronous communictation with a different XML Web
' service.
Return remoteService.BeginGetAuthors(chainedCallback, state)
End Function
' Intermediate method to handle chaining the asynchronous calls.
Public Sub AuthorRoyaltiesCallback(ByVal ar As IAsyncResult)
Dim state As AsyncStateChain = CType(ar.AsyncState, _
AsyncStateChain)
Dim rs As RemoteService = New RemoteService()
' Gets the result from the call to GetAuthors.
Dim allAuthors As Authors = rs.EndGetAuthors(ar)
Dim found As Boolean = False
' Verifies that the requested author is valid.
Dim i As Integer = 0
Dim row As DataRow
While (i < allAuthors.authors.Rows.Count And (Not found))
row = allAuthors.authors.Rows(i)
If (row("au_lname").ToString() = state.Author) Then
found = True
End If
i = i + 1
End While
If (found) Then
Dim cb As AsyncCallback = state.originalCallback
' Calls the second Web service, because the author is
' valid.
rs.BeginReturnedStronglyTypedDS(state.Author, cb, state)
Else
' Cannot throw the exception in this function or the XML Web
' service will hang. So, set the state argument to the
' exception and let the End method of the chained XML Web
' service check for it.
Dim ex As ArgumentException = New ArgumentException( _
"Author does not exist.", "Author")
Dim cb As AsyncCallback = state.originalCallback
' Call the second Web service, setting the state to an
' exception.
rs.BeginReturnedStronglyTypedDS(state.Author, cb, ex)
End If
End Sub
' Define the End method.
<WebMethod()> _
Public Function EndGetAuthorRoyalties(ByVal asyncResult As _
IAsyncResult) As localhost.AuthorRoyalties
' Return the asynchronous result from the other Web service.
Return remoteService.EndReturnedStronglyTypedDS(asyncResult)
End Function
End Class
' Class to wrap the callback and state for the intermediate asynchronous
' operation.
Public Class AsyncStateChain
Public originalCallback As AsyncCallback
Public originalState As Object
Public Author As String
End Class
End Namespace
另請參閱
工作
概念
非同步 XML Web Service 方法
以非同步方式與 XML Web Service 通訊