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

时间:2010-09-14 23:34:43

标签: c# .net wcf callback

我尝试了不同的问题,检查我的个人资料中的另外两个问题,解释了我对这种情况采取的方法遇到的困难。我会在这里跳过它们。

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

  • 服务器的调用线程被阻塞,直到客户端发送响应。
  • 服务器的回调是由某些事件提示的,例如计时器,而不是客户端的调用。
  • 客户端不需要在服务器回调的上下文中回调服务器,因此不存在死锁挑战。
  • 客户可以采取一个或多个用于执行计算的参数(以及此练习应该采取的行动)
  • 客户可以返回(并且本练习应该返回)非无效结果
  • 使用的方法至少应该兼容,如果没有实现,可以依次处理多个客户端,包括subscribe()和unsubscribe()功能。
  • 这不是作业,它是作为如何构建基于WCF的订阅者/发布者服务器的示例,该服务器支持(少数)具有低延迟服务器 - 客户端通信的可信客户端,而无需轮询和不丢弃消息(通过围栏)
  • 我特别对涉及(IsOneWay = true)的解决方案不感兴趣,除非我很清楚我对它的含义及其后果感到非常困惑。

谢谢!

1 个答案:

答案 0 :(得分:3)

检查CodeProject上的this article。这描述了回调的基本示例。你可能不得不改变一些事情:

  • 在回调合约上,操作标记为一种方式 - 这是为了避免因客户端不良而阻塞服务器(建议的做法)。但是如果你必须阻止服务器,那么你需要删除一种方法。请注意,如果您要逐个回调多个客户端,那么您可能必须在不同的线程上回调每个客户端,否则第一个客户端将阻止回调到下一个客户端。

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

  • 如果客户端必须在回调中返回一些结果,则无法再使用OneWay。

  • 如前所述,订阅仅指添加到列表(示例中的加入方),取消订阅意味着从列表中删除(离开方)。

修改

我已从example看到了源代码,并将其修改如下:

在回调合约中添加了一个方法Echo

public interface IBeerInventoryCallback
{
   ...

    [OperationContract]
    string Echo(string message);
}

当某人离开聚会并从控制台上的客户端打印响应时,从服务中调用Echo。它没有任何问题。

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