代码之家  ›  专栏  ›  技术社区  ›  Rob Gray

查找使用wcf net.tcp发送消息所用的时间

  •  2
  • Rob Gray  · 技术社区  · 16 年前

    我m正在编写一个支持WCF的分布式应用程序原型,以尝试找出任何问题,我会升级我现有的通过TCP发送XML以通信我获得的应用程序。i_m使用回调契约向服务器注册客户机(servicehost中的singleton),到目前为止,客户机和服务器之间的所有通信都在工作。我可以将多个客户机连接到服务器,并从服务器发送由所有客户机接收的广播。我可以阻止一个特定的客户机,而其他客户机仍然可以接收这些呼叫。这很好。

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

    是否有类似于SOAP扩展的东西,在那里我可以添加到服务器的传出和客户端的传入?或者,我是否需要向服务器在客户机上调用的每个方法添加一个__timesent_157;参数,并记录在客户机上接收到的时间(yuck!)?是否有更好的方法来实现这一点?

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

    2 回复  |  直到 16 年前
        1
  •  1
  •   tomasr    16 年前

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

    你说得对,它不支持soapextensions,但实际上,它有一组更丰富的扩展点。在您的特定情况下,我认为添加messageinspector的自定义行为可能有效。

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

    在服务端连接分派检查器的最简单方法是通过服务行为(ISeviceBehavior),因为可以将其作为自定义属性连接到服务实现。这里有一个 simple example 如何做到这一点。您也可以通过IEndPointBehavior连接它,但是您需要通过设置服务主机时的代码或通过配置(这需要编写更多的代码)来实现这一点。

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

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

        2
  •  2
  •   dguaraglia    16 年前

    六羟甲基三聚氰胺六甲醚。。。这是一个困难的问题。这里的问题是,您甚至不能确保客户端和服务器计时器都是同步的。

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