【问题标题】:Calling a service from a callback method in Client从客户端中的回调方法调用服务
【发布时间】:2009-11-23 09:34:27
【问题描述】:

我有一个场景,当客户端收到一个回调方法的命令时,客户端需要调用另一个服务。 例如: 在 OnNewCommand() 回调方法中,客户端收到一条消息 X。现在客户端必须调用服务器中定义的 Service1()。注意,客户端已注册到 Service1() 的回调。我不能使用相同的客户端对象来调用 Service1(),因为它会导致死锁。所以我使用一个新的客户端对象来调用Service1()。但它会挂起,直到超时期限到期。 知道如何解决吗? 谢谢

【问题讨论】:

    标签: wcf client callback nested


    【解决方案1】:

    我遇到了同样的问题(回调挂起直到超时)。 我通过在实现回调接口的对象上设置属性解决了这个问题:

    [CallbackBehavior(UseSynchronizationContext = false)]
    

    【讨论】:

    • +1,感谢您的回答,我的回调实际上现在被回调了 :)
    【解决方案2】:

    您可能遇到了死锁...

    如果可能,将您的回调方法定义为“OneWay”和/或对它们进行非阻塞调用,例如“begin_m1(...)”

    还要检查您在客户端和服务器上使用的 ConcurrencyMode 是否可以使用 ConcurrencyMode.Reentrant 或 ConcurrencyMode.Muliple

    请参阅Programming WCF services 的第 5 章,了解有关此问题的详细讨论

    【讨论】:

      【解决方案3】:

      同样的问题。不得不添加

      [CallbackBehavior(ConcurrencyMode=ConcurrencyMode.Reentrant, UseSynchronizationContext=false)]
      

      在我的回调类之上。

      【讨论】:

        【解决方案4】:

        在我的脑海中,有几件事要检查:

        • 如果您使用的是 HTTP,请增加从客户端到 HTTP 服务器的 HTTP connections allowed 的数量。默认为 2,可能不足以满足您的需求。
        • 确保 WCF 服务中的 throttling options 足以处理所有需要的连接。

        【讨论】:

          【解决方案5】:

          您的服务可能没有对其行为设置 ConcurencyMode。

          查看类似[ServiceBehavior(ConcurencyMode=ConcurencyMode.Reentrant)] 的内容 或类似的属性(如 CallbackBehavior)

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2016-05-16
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-03-21
            • 1970-01-01
            相关资源
            最近更新 更多