我有一个WCF服务,它在常规客户端->服务器调用方面运行得非常好。然而,我试图在服务中引入一个简单的回调,但它不起作用。。。最终,我不确定我哪里出了问题,所以让我给你看看设置,告诉你我所知道的。
1) 合同
public interface IPIRSCallbackService
{
[OperationContract]
void OnCallback();
}
[ServiceContract(CallbackContract = typeof(IPIRSCallbackService))]
public interface IPIRSService
{ etc...
2) 服务器合同实施
注意:我检查了回调通道的状态,它是"打开的"——但不确定这值多少钱。
[ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Reentrant)]
class PIRSService : IPIRSService
{
public PIRSService()
{
callback = OperationContext.Current.GetCallbackChannel<IPIRSCallbackService>();
var x = ((ICommunicationObject)callback).State;
callback.OnCallback(); // HANGS HERE
}
etc.
3) 客户端-创建代理
现在,这可能不是你会看到的常见方式,因为我正在使用ViewModelLocator将服务注入到我的视图模型中。。。但我确信这不是问题的根源。。。请注意,正常的服务呼叫工作绝对正常。
ViewModelLocator注册服务实例
SimpleIoc.Default.Register<PIRSService>(() =>
{
IPIRSCallbackService callback = new PIRSCallbackService();
InstanceContext context = new InstanceContext(callback);
return new PIRSService(context, "PIRSClient");
}, true);
SimpleIoc.Default.Register<IPIRSService>(() =>
{
return SimpleIoc.Default.GetInstance<PIRSService>();
}, true);
4) 连接到服务
DuplexChannelFactory<IPIRSService> channelFactory = new DuplexChannelFactory<IPIRSService>(callbackContext, endpointConfigName);
channelFactory.Credentials.UserName.UserName = userName;
channelFactory.Credentials.UserName.Password = password;
proxy = channelFactory.CreateChannel();
((IClientChannel)proxy).Open();
5) 客户端-端点配置
<endpoint address="net.tcp://localhost:20437/PIRSService" binding="netTcpBinding"
bindingConfiguration="StandardNetTcpBinding" contract="PIRS_Common.Service.IPIRSService"
name="PIRSClient" kind="" endpointConfiguration="" behaviorConfiguration="CustomBehavior">
<identity>
<dns value="WCfServer" />
</identity>
</endpoint>
所以,我不知道为什么回调合约的客户端实现没有被激发。。。因此服务器端对回调方法的调用挂起。。。因为它正在等待回调完成。我确信这是回调没有正确注册的问题。。。但我不确定我做错了什么。我需要在客户端端点或其他任何地方注册回调合约吗?
您可能需要确保将"ConcurrentMode.Multure"添加到实现回调的类的"CallbackBehavior"属性中。
[CallbackBehavior(ConcurrencyMode=ConcurrencyMode.Multiple)]
回调并发模式引用:
http://blogs.msdn.com/b/dsnotes/archive/2013/09/18/wcf-callback-operations-are-invoked-sequentially.aspx
此外,如果您还没有,您可能需要考虑启用WCF跟踪,以确保服务器确实在调用客户端回调方法。
WCF跟踪引用:http://msdn.microsoft.com/en-us/library/ms733025.aspx