wcf - 在 CaSTLe.Windsor 中将客户端基于任务的操作与 WCFFacility 结合使用

标签 wcf castle-windsor async-await wcffacility

我想利用 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/

相关文章:

c# - ASP.Net:在 Page_Load 中调用异步方法

javascript - 如何使用 Promise 等待函数内的事件完成然后再次调用该函数?

wcf - 消息或具有 MessageContractAttribute 和其他不同类型参数的类型

c# - 使用 NET.TCP 的 WCF 传输 Windows 身份验证仅在本地有效

c# - 将拦截器添加到现有的 CaSTLe.DynamicProxy 代理

dependency-injection - 针对控制反转框架运行的依赖浏览器

web-services - 如何为 iis 托管的 wcf svc 设置端口?

.net - iOS 应用程序的 WCF 或 Web 服务 (.asmx)?

c# - 使用 CaSTLe 容器中的已注册组件为另一个组件提供依赖项

python - 断言isinstance(地址,(元组,列表,str)), "tuple or str expected"AssertionError : tuple or str expected