我在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生成基于任务的操作。
答案 0 :(得分:2)
默认情况下,您已添加到解决方案doesn't have asynchronous operations中的服务参考,但您可以启用它们并确定您用于async
方法的选项 - 基于任务的或旧式的异步。此选项在Advanced
设置中可用于服务参考。
如果您正在使用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导入客户端,因为它需要了解合同和数据合同。