【问题标题】:Finding the time taken to send messages with WCF net.tcp查找使用 WCF net.tcp 发送消息所花费的时间
【发布时间】:2008-10-01 22:25:53
【问题描述】:

我正在编写一个支持 WCF 的分布式应用程序原型,以尝试找出我在升级现有的“通过 tcp 发送 xml 以进行通信”应用程序时遇到的任何问题。我正在使用回调合同向服务器注册客户端(ServiceHost 中的单例),到目前为止,客户端和服务器之间的所有通信都正常工作。我可以将多个客户端连接到服务器并从服务器发送所有客户端都接收到的广播。我可以阻止一个特定的客户,而其他客户仍然会接到电话。这很好。

为了继续学习和评估性能,我希望客户端记录服务器发送每条消息的时间,以及客户端接收相同消息的时间。我应该怎么做?

是否有类似于 SOAP 扩展的东西,我可以在其中添加从服务器传出和传入客户端的内容?或者我是否需要为服务器在客户端调用的每个方法添加一个“timeSent”参数并记录客户端接收到的时间(糟糕!)?有没有更好的方法来做到这一点?

我使用的是 net.tcp 而不是 wsDualHttpBinding(也可以使用,但性能较差)。

【问题讨论】:

    标签: c# .net wcf distributed-apps


    【解决方案1】:

    嗯……这很难。这里的问题是您甚至无法确保客户端和服务器计时器同步。

    如果你要做的是发送一些带外数据,这样你就不需要修改你的方法,你可以使用here建议的方法。我觉得应该够了。

    【讨论】:

    • 感谢大卫。我考虑过肥皂扩展,但由于我的应用程序使用 net.tcp 并且不是 Web 服务,所以肥皂扩展不可用。你说得对,我真的不想也不应该在方法签名中添加带外信息。
    【解决方案2】:

    David 对时钟同步问题的看法是正确的。但是,在服务/客户端实现之外添加时间戳信息在 WCF 上一点也不难。

    你说得对,它不支持 SoapExtensions,但事实上,它具有更丰富的扩展点集。在您的具体情况下,我认为添加 MessageInspector 的自定义行为可能会起作用。

    实际上有两个消息检查器接口:一个用于客户端 (IClientMessageInspector),一个用于服务器 (IDispatchMessageInspector)。

    在服务端连接调度检查器的最简单方法是通过服务行为 (IServiceBehavior),因为您可以将其作为自定义属性连接到服务实现。这是simple example 的操作方法。您也可以通过 IEndpointBehavior 将其连接起来,但您需要在设置服务主机时通过代码或通过配置来实现,这需要编写更多代码。

    在客户端,您仍然使用端点行为,但通过代码引入这些行为要容易得多,因为您可以从代理客户端直接访问 ClientRuntime。

    无论如何,我认为最好将时间戳之类的东西作为自定义标头添加到消息中,这样它就不会直接成为消息有效负载的一部分。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多