如何为同步服务实现异步wcf客户端

时间:2013-01-14 17:46:59

标签: wcf asynchronous

有没有办法在不添加服务引用的情况下为同步WCF服务创建异步客户端?这适用于.NET 4客户端。

1 个答案:

答案 0 :(得分:3)

Visual Studio中的服务引用只不过是一个代码生成器,它创建一个代理类,其中包含调用Web服务所需的相应数据元素。当然,如果你真的想要做一些单调乏味的工作,你可以手工建立一个代理。

也许首先使用.net反射器?

反编译System.ServiceModel.ClientBase

对ChannelFactory进行一些研究:http://msdn.microsoft.com/en-us/library/system.servicemodel.channelfactory.aspx

即使通过包装ChannelFactory实现我自己的客户端,我仍然在另一个项目中使用Add Service引用来创建类定义并将它们移动到真实项目中。这是一个很好的妥协。

这是一个简单的异步服务接口:

[ServiceContract(Name = "IService")]
public interface IServiceAsync
{
    [OperationContract(AsyncPattern = true)]
    IAsyncResult BeginGetStuff(string someData, AsyncCallback callback, object state);

    IEnumerable<Stuff> EndGetStuff(IAsyncResult result);
}

.NET合约可能如下所示:

[ServiceContract]
public interface IService
{
    [OperationContract]
    IEnumerable<Stuff> GetStuff(string someData);
}

然后在代码中,假设你使用HTTP,没有安全性和二进制消息编码,就像这样(抱歉我没有编译任何这些,只是使用我为项目编写的一些代码键入它):

//Create a binding for the proxy to use
HttpTransportBindingElement httpTransportBindingElement;

httpTransportBindingElement = new HttpTransportBindingElement();
absoluteServiceUri = new Uri(absoluteServiceUri.OriginalString + BinaryEndpointUri, UriKind.Absolute);
}

//Create the message encoding binding element - we'll specify binary encoding
var binaryMessageEncoding = new BinaryMessageEncodingBindingElement();

//Add the binding elements into a Custom Binding            
var customBinding = new CustomBinding(binaryMessageEncoding, httpTransportBindingElement);

// Set send timeout
customBinding.SendTimeout = this.SendTimeout;   

var factory = new ChannelFactory<IServiceAsync>(customBinding, new EndpointAddress(absoluteServiceUri, new AddressHeader[0]));

var channel = factory.CreateChannel();
channel.BeginGetStuff(Bla, results => { // Do something }, null);