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

时间:2008-10-01 22:25:54

标签: c# .net wcf distributed-apps

我正在编写一个启用WCF的原型分布式应用程序,试图找出任何问题我将升级现有的“通过tcp发送xml以进行通信”我已经获得的应用程序。我正在使用Callback Contracts向服务器注册客户端(ServiceHost中的Singleton),到目前为止,客户端和服务器之间的所有通信都工作。我可以将多个客户端连接到服务器,并从所有客户端接收的服务器发送广播。我可以阻止特定客户端,其他客户端仍然可以接收呼叫。这很好。

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

是否有类似于SOAP扩展的东西,我可以从服务器添加到传出并传入客户端?或者我需要为服务器在客户端上调用的每个方法添加一个“timeSent”参数,并记录在客户端上收到的时间(哎呀!)?有没有更好的方法来实现这一目标?

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

2 个答案:

答案 0 :(得分:2)

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

如果您要执行的操作是发送一些带外数据,以便您不需要修改方法,则可以使用建议的方法here。我认为这应该足够了。

答案 1 :(得分:1)

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

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

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

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

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

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