对WCF异步调用进行服务操作

对客户端究竟应该如何执行WCF异步调用,如何采用编程方式获得服务代理对象,这些问题都是很头疼的问题,
首页 新闻资讯 行业资讯 对WCF异步调用进行服务操作

希望我对WCF异步调用的一点经验能给大家带来帮助,导致WCF异步的原因也许还有很多,不过在你遇到错误时,可以先检查一下你程序中的字符串,暂时把他们置为””,试试看。没准就是他引起的问题啊。

我将服务契约的定义单独形成了一个程序集,并在客户端直接引用了它。然而,在这样的服务契约程序集中,是没有包含异步方法的定义的。因此,我需要修改在客户端的服务定义,增加操作的异步方法。这无疑为服务契约的重用带来障碍。至少,我们需要在客户端维持一份具有异步方法的服务契约。#t#

所幸,在客户端决定采用WCF异步调用用我所设计的服务操作时,虽然需要修改客户端的服务契约接口,但并不会影响服务端的契约定义。因此,服务端的契约定义可以保持不变,而在客户端则修改接口定义如下

复制

[ServiceContract]  public interface IDocumentsExplorerService  {  [OperationContract]  Stream TransferDocument(Document document);  [OperationContract(AsyncPattern = true)]  IAsyncResult BeginTransferDocument(Document document,  AsyncCallback callback, object asyncState);  Stream EndTransferDocument(IAsyncResult result);  }
  • 1.

  • 2.

  • 3.

  • 4.

  • 5.

  • 6.

  • 7.

  • 8.

  • 9.

  • 10.

注意,在BeginTransferDocument()方法上,必须在OperationContractAttribute中将AsyncPattern属性值设置为true,因为它的默认值为false。

WCF异步调用方式如下:

复制

BasicHttpBinding binding = new BasicHttpBinding();  binding.SendTimeout = TimeSpan.FromMinutes(10);  binding.TransferMode = TransferMode.Streamed;  binding.MaxReceivedMessageSize = 9223372036854775807;  EndpointAddress address = new EndpointAddress  ("http://localhost:8008/DocumentExplorerService");  ChannelFactory factory =   new ChannelFactory(binding,address);  m_service = factory.CreateChannel();  ……  IAsyncResult result = m_service.BeginTransferDocument(doc,null,null);  result.AsyncWaitHandle.WaitOne();  Stream stream = m_service.EndTransferDocument(result);
  • 1.

  • 2.

  • 3.

  • 4.

  • 5.

  • 6.

  • 7.

  • 8.

  • 9.

  • 10.

  • 11.

  • 12.

  • 13.

14    2009-12-07 14:35:42    WCF异步调用