ASP.NET创建Web服务之异步Web服务

来源:计算机等级考试    发布时间:2012-08-28    计算机等级考试视频    评论

  下面的代码示例显示当一个XML Web服务方法产生了一个以上的异步调用并且这些调用必须连续执行时如何连接这些异步调用。BeginGetAuthorRoyalties方法产生一个异步调用用来判断传入的作者名是否有效,并设置一个名为AuthorRoyaltiesCallback的中间回调来接收结果。如果作者名有效,那么那个中间回调异步调用来获得作者的版税。

[C#]
using System.Web.Services;
using System.Data;
using System;
// This imports the proxy class for the XML Web services
// that the sample communicates with.
using AsyncWS.localhost;

namespace AsyncWS
{
 [WebService(Namespace="http://www.contoso.com/")]
 public class MyService : System.Web.Services.WebService
 {
  public RemoteService remoteService;
  public MyService()
  {
   remo teService = 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 XML 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 XML Web service, setting the state to an
   // exception.
   rs.BeginReturnedStronglyTypedDS(state.Author,cb,ex);
  }
 }

 [WebMethod]
 public AuthorRoyalties EndGetAuthorRoyalties(IAsyncResult asyncResult)
 {
  // Check whehter the first XML 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;
}
}

[Visual Basic]

Imports System.Web.Services
Imports System.Data
Imports System
' This imports the proxy class for the XML Web services
' that the sample communicates with.
Imports AsyncWS_VB.localhost

Namespace AsyncWs

<WebService(Namespace:="http://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 XML 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 XML 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 XML 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

上一页12下一页

视频学习

我考网版权与免责声明

① 凡本网注明稿件来源为"原创"的所有文字、图片和音视频稿件,版权均属本网所有。任何媒体、网站或个人转载、链接转贴或以其他方式复制发表时必须注明"稿件来源:我考网",违者本网将依法追究责任;

② 本网部分稿件来源于网络,任何单位或个人认为我考网发布的内容可能涉嫌侵犯其合法权益,应该及时向我考网书面反馈,并提供身份证明、权属证明及详细侵权情况证明,我考网在收到上述法律文件后,将会尽快移除被控侵权内容。

最近更新

社区交流

考试问答