2

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

为了继续学习和评估性能,我希望客户端记录服务器发送每条消息的时间,以及客户端接收相同消息的时间。我应该如何最好地解决这个问题?

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

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

4

2 回答 2

2

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

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

于 2008-10-02T00:26:58.523 回答
1

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

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

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

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

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

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

于 2008-10-02T12:50:27.643 回答