我想利用 WCF 客户端的新的基于任务的操作。我目前使用 WCFFacility 的方式如下:
container.Register(Component
.For<IAdminService>()
.LifeStyle.Transient
.AsWcfClient(new DefaultClientModel()
{
Endpoint = WCFHelpers.BasicHttp(settings.MaxReceivedMessageSize)
.At(addr)
}));
其中 IAdminService 是 ServiceContract 类。所有有关基于任务的操作的 MSDN 文章都提到在导入服务引用时设置“基于任务的操作”复选框。但在我当前使用的样式中,没有导入服务引用,因为我只是直接引用服务契约接口(interface)。
所以我想知道如何通过对当前代码进行最少的更改来启用对基于任务的操作的支持。
[顺便说一句 - WCFHelpers 是一个实用程序类,它生成 BindEndpointModel,并且在执行此代码之前将 addr 设置为适当的端点地址]
最佳答案
WCFFacility 提供了一些符合旧异步模式的扩展方法。这些可以轻松转换为任务。
尝试这些扩展方法:
public static class ClientExtensions
{
public static async Task<TResult> CallAsync<TProxy, TResult>(this TProxy proxy, Func<TProxy, TResult> method)
{
return await Task.Factory.FromAsync(proxy.BeginWcfCall(method), ar => proxy.EndWcfCall<TResult>(ar));
}
public static async Task CallAsync<TProxy>(this TProxy proxy, Action<TProxy> method)
{
await Task.Factory.FromAsync(proxy.BeginWcfCall(method), ar => proxy.EndWcfCall(ar));
}
}
在异步方法中,可以像这样调用它们:
// Func<T>
var result = await client.CallAsync(p => p.SayThisNumber(42));
// Action
await client.CallAsync(p => p.DoSomething());
关于wcf - 在 CaSTLe.Windsor 中将客户端基于任务的操作与 WCFFacility 结合使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18302560/