基于WCF任务的异步回调

时间:2017-04-10 11:03:26

标签: wcf asynchronous callback task-parallel-library

我在VS2015中创建了WCF服务:

[ServiceContract(CallbackContract = typeof(IMyCallback))]
public interface IMyService { }

IMyCallback看起来像:

[ServiceContract]
public interface IMyCallback {

[OperationContract]
Task<string> OnServerEvent(UserAppEventData evData);

我已经构建了服务器,运行它,然后添加了服务引用(通过右键单击解决方案资源管理器)。
客户端对象定义为

 [CallbackBehaviorAttribute(
     ConcurrencyMode = ConcurrencyMode.Reentrant,
     IncludeExceptionDetailInFaults = true,
     UseSynchronizationContext = true,
     ValidateMustUnderstand = true
)]
public class QMyClient : IMyCallback { }

以同步方式自动生成的接口实现方法:

public string OnServerEvent(UserAppEventData evData) { }

此代码无法正常工作(并且不是异步的),并在OnServerEvent挂起客户端。

当我手动将代码更改为

public async Task<string> OnServerEvent(UserAppEventData evData)

并在自动生成的&#34;服务references\...\Reference.cs中完成相同的,一切正常。但是,每次我更新服务参考时,我都不想更改Referenece.cs

是否有任何方法可以强制&#34;更新服务参考&#34;在回调中制作TBA OperationContractAttribute

在普通WCF服务方向,一切正常,VS生成基于任务的操作。

2 个答案:

答案 0 :(得分:2)

默认情况下,您已添加到解决方案doesn't have asynchronous operations中的服务参考,但您可以启用它们并确定您用于async方法的选项 - 基于任务的或旧式的异步。此选项在Advanced设置中可用于服务参考。

enter image description here

如果您正在使用svcutil工具,则会创建基于任务的方法by default,但是,您可以通过/async或{等标志更改此行为{1}}。

答案 1 :(得分:1)

@VMAtm的建议会很好。

我认为,你也可以在这个场景中使用ChannelFactory。它非常灵活,您可以从客户端等待服务操作。额外的好处是,当服务端存在这些类型的更改时,您无需修改​​客户端。

类似的东西:

var channelFactory = new ChannelFactory<IService>(
                    "WSHttpBinding_IService" // endpoint name
                    ); 

IService channel = channelFactory.CreateChannel();

string result = await channel.OnServerEvent();

Console.WriteLine(result);

请注意,对于这种情况,您必须将公共接口库作为dll导入客户端,因为它需要了解合同和数据合同。