代码之家  ›  专栏  ›  技术社区  ›  Jason Kleban

带返回值的WCF服务器到客户端回调方法

  •  3
  • Jason Kleban  · 技术社区  · 14 年前

    我尝试了不同的方法来回答这个问题,检查我的个人资料中的其他两个问题,解释了我在处理这个场景的方法中遇到的困难。我在这里跳过它们。

    我只需要一个服务器回调客户机(通过nettcp通道)的示例(首选),客户机计算一个答案,并返回一个结果。

    • 在客户端发送响应之前,服务器的调用线程将被阻塞。
    • 服务器的回调是由一些事件(如计时器)而不是客户机的调用来提示的。
    • 客户机不需要在服务器回调的上下文中回调服务器,因此不应该存在死锁问题。
    • 客户可以(并且在这个练习中,应该)使用一个或多个参数来执行计算。
    • 客户可以返回(并且对于这个练习,应该返回)一个非无效的结果。
    • 如果没有实现,所使用的方法至少应该兼容,能够依次处理多个客户机,包括subscribe()和unsubscribe()功能。
    • 这不是家庭作业,它是如何构建一个基于WCF的订阅/发布服务器的示例,该服务器支持(少数)个受信任的客户机,具有低延迟的服务器客户机通信,无需轮询,也无需抛出消息(越过围栏)。
    • 我对涉及 (IsOneWay = true) 除非我对它的意义和后果感到非常困惑。

    谢谢!

    1 回复  |  直到 14 年前
        1
  •  3
  •   VinayC    14 年前

    检查 this article 在代码项目上。这描述了回调的基本示例。你可能需要改变的事情很少:

    • 在回调契约中,标记为单向的操作——这是为了避免由于客户机不好而阻塞服务器(推荐的做法)。但是,如果必须阻止服务器,则需要删除一种方法。请注意,如果要逐个回调多个客户机,则可能需要在不同的线程上回调每个客户机,否则,第一个客户机将阻止对下一个客户机的回调。

    • 何时调用回调实际上是一种服务器实现。给定的示例维护一个每当客户端加入(或订阅您的需求)时的客户端回调通道列表。现在这个列表可以用任何方式调用回调。因此,您可以通过简单地遍历列表来调用计时器上的回调。请注意,您必须确保对列表的线程安全访问。

    • 如果客户端必须在回调中返回某些结果,则不能再次使用单向。

    • 如前所述,订阅意味着简单地添加到列表中(示例中的join party),取消订阅意味着从列表中删除(leave party)。

    编辑 :

    我已经从 example 修改如下:

    增加一种方法 Echo 在回拨合同中:

    public interface IBeerInventoryCallback
    {
       ...
    
        [OperationContract]
        string Echo(string message);
    }
    

    当有人离开参与方并在控制台上打印来自客户机的响应时,调用了来自服务的echo。没有任何问题也能奏效。

    请注意,此示例使用继承自的vs生成的客户端代理 System.ServiceModel.DuplexClientBase<T> 这使得客户端代码更简单。也许,你应该试试。