查找使用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)之类的消息作为自定义标头添加到消息中,以便它不直接成为消息有效负载的一部分。