【问题标题】:WCF callback not invoked on the client-side and hangs on the server-sideWCF 回调未在客户端调用并在服务器端挂起
【发布时间】:2014-01-08 13:25:06
【问题描述】:

我有一个 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>

所以,我不知道为什么回调合约的客户端实现没有被触发......因此服务器端对回调方法的调用挂起......因为它正在等待回调完成。我确定这是回调未正确注册的问题......但我不确定我做错了什么。我是否需要在客户端端点或其他任何地方注册回调合同?

【问题讨论】:

    标签: c# .net wcf callback


    【解决方案1】:

    您可以确保将“ConcurrencyMode.Multiple”添加到实现回调的类的“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

    【讨论】:

    • 感谢您的指点!我已经在客户端和服务器端启用了跟踪,并且记录了服务器发送回调并且客户端接收回调请求......并且在那之后没有记录任何其他内容!我不知道发生了什么,因为我确信必须正确建立连接才能将消息发送到客户端......但是为什么没有触发合同方法?如果我发布日志会有用吗?因为我可能遗漏了什么!
    • 有趣的是......回调请求在客户端处理,但它没有达到实际执行请求的地步......但不确定这不会发生!活动中记录的最后一个阶段是“安全协议验证了传入消息”......我知道这可能看起来像是一个安全问题......但该声明确实暗示消息已成功验证!但老实说,我现在不知道该去哪里......任何指导将不胜感激!
    • 我不确定问题出在哪里,所以也许您可以确认或更正以下简单的流程语句:客户端 --> 服务器 --> 回调 -ERROR-> 客户端
    • 我会说它更像是客户端 --> 服务器 --> 回调 --> 客户端 -ERROR ,我之所以说错误是在客户端之后是因为客户端确实收到了回调请求,但没有正确处理/实际上调用回调方法实现!我已经发布了关于跟踪日志的另一个问题...如果您有时间请看一下(非常感谢)-stackoverflow.com/questions/21018450/wcf-callback-not-executed
    • 所以,澄清一下,客户端成功调用服务,服务成功回调客户端。如果这是正确的,我对问题/缺少功能感到困惑。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-27
    • 1970-01-01
    • 2012-06-23
    • 2012-11-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多