如何使用WCF的ChannelFactory <t>?</t>实现客户端异步调用

时间:2014-04-18 04:57:08

标签: .net web-services wcf asynchronous

假设我们正在使用WCF的ChannelFactory为Calculator Web服务编写客户端。服务合同通过实现服务和客户端引用的第三个程序集共享。以下是服务合同(不能更改!)

public interface ICalculator 
{
    int Add(int x, int y);
}

ChannelFactory创建一个透明的代理对象,该对象“模拟”ICalculator服务契约,将方法调用传递给RealProxy对象,然后该对象将消息发送到WCF通道堆栈。有没有办法操纵WCF(仅在客户端!)自动公开任务友好的服务操作,类似于VS自动生成的服务代理?

要清楚,我不打算将我的服务修改为异步友好。我希望我的客户端在等待通常阻止服务调用完成时继续处理。

2 个答案:

答案 0 :(得分:2)

public interface ICalculator 
{
    Task<int> Add(int x, int y);
}

将此作为合约使用。但是,您需要确保运行.net 4.5才能使其正常工作。

请记住在服务器端使用此模式

public class Calculator : ICalulator
{
    public Task<int> Add(int x, int y)
    {
        int result = x + y;
        return Task.FromResult(result);
    }
}

答案 1 :(得分:2)

我使用ILSpy做了一些探索,发现ChannelFactory和VS&#39;服务代理代码都利用封底下的相同代码为ICalculator生成透明代理。唯一的区别是自动代码创建了一个自定义接口,它反映了服务的合同,以及Task异步方法,其OperationContract属性指向&#34; real&#34;服务操作URI。

[ServiceContract]
public interface ICalculatorClient
{
    [ServiceOperation(Action="http://tempuri.org/ICalculator/Add")]
    Task<int> AddAsync(int x, int y);
}

因此,我没有使用包含原始服务的服务合同的程序集,而是在客户端代码中创建了自己的ICalculatorClient服务合同(该名称只是为了消除此测试的歧义),其中包含所需的任务异步方法调用,仅使用必需的ServiceOperation属性,其Action属性指向&#34; real&#34;的URI。服务器合同上的服务操作。

在运行时,观察到了所需的行为:我的客户端代码在等待来自服务器的响应时继续进行,最终按预期收到响应。该服务并非明智,未经过修改以满足客户需求。客户端更聪明,可以控制与Web服务交互的细节。