关于c#:查找使用WCF net.tcp发送消息所花费的时间

Finding the time taken to send messages with WCF net.tcp

我正在编写一个支持WCF的分布式应用程序原型,以尝试找出所有问题,这些问题将升级我现有的"通过tcp发送xml以进行通信"应用程序。我正在使用Callback Contracts向服务器(在ServiceHost中为Singleton)注册客户端,到目前为止,客户端和服务器之间的所有通信均有效。我可以将多个客户端连接到服务器,并从所有客户端接收的服务器发送广播。我可以阻止特定的客户端,而其他客户端仍会收到呼叫。很好。

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

是否存在类似于SOAP扩展的东西,我可以在其中添加服务器的输出和客户机的输入?还是我需要在服务器在客户端上调用的每个方法中添加一个" timeSent"参数,并记录在客户端上收到的时间(糟糕!)?有没有更好的方法可以做到这一点?

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


嗯...那是困难的。这里的问题是,您甚至无法确保客户端和服务器计时器都同步。

如果您要发送的是一些带外数据,从而无需修改方法,则可以使用此处建议的方法。我认为应该足够了。


David关于时钟同步的问题是正确的。但是,在WCF上将时间戳信息添加到服务/客户端实现之外并不困难。

您是对的,尽管实际上,它不支持SoapExtensions,但它具有一组更丰富的可扩展性点。在您的特定情况下,我认为添加MessageInspector的自定义行为可能会起作用。

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

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

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

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