2010-02-09 45 views
4

我创建了一个WCF服务,其中ServiceHost类不能实例化为单例。我需要监视与此服务的每个连接,甚至在首次调用与之关联的方法之前。实际上,我想记录客户何时打开一个通道与服务进行通信。可能吗? 在网上我发现只有两种解决方案:如何监视客户端与WCF服务的连接?

  1. ServiceHost的对象必须被服务器实例化,并作为一个单身。然后我必须提供一个由客户端调用的初始方法来注册它自己的服务。
  2. 使用性能监视器显示与该服务相关的计数器。

(1)和(2)都不满足我的需求,因为我想创建自己的应用程序,正如我之前所说的,我不能使用单例模式。 你有没有遇到过这种问题?你是如何管理它的?

最后但并非最不重要的是,我还需要监视对服务提供的每种方法的调用。有没有办法做到这一点? 任何帮助将不胜感激。

+0

这有帮助吗? http://stackoverflow.com/questions/711611/fire-event-when-client-connects-to-wcf-hosted-endpoint – ujjb 2014-02-13 22:04:24

回答

4

这有很多问题。

首先,调用WCF服务的首选方法是每个呼叫模型,例如,你的客户端将调用一个服务方法,这会导致在服务器上创建一个服务类的实例,执行相关方法,然后再次处理该服务实例。所以你不能真正监控客户端连接本身 - 它们在呼叫执行时只存在一秒钟。

另外,在性能计数器之外,服务器端实际上没有太多的基础设施来监视每秒的呼叫等。新的服务器插件产品(以前称为“都柏林”(当前称为“AppFabric”))应该会在该领域带来不少改进(可管理性) - 请参阅此MSDN article for more info

但即使在今天,您也可以设想自己接受服务类,并监视该类的实例化和销毁。该服务类别还有一个指向ServiceHost的链接,该链接通过OperationContext.Current.Host属性实例化 - 因此您可以设想以某种方式向主机发信号通知已创建新的服务类实例。只有一个东西可以成为单个主机对象,这样才能工作,但是需要在ServiceHost上有一个经过充分考虑并经过充分测试的多线程安全方法(您可以创建自己的定制ServiceHost来实现类似的功能)。

这可能是“监视我的服务”方向的一个步骤。至于性能监控 - 为什么现有的几十个WCF性能计数器不能帮助您或为您提供所需的信息?

+0

谢谢你的回答,但你提出的解决方案不符合我的要求。服务类的构造函数仅在调用其中一种服务方法时调用,而不在客户端连接到服务时调用。我需要这种信息。任何想法? – 2010-02-10 08:54:31

+0

客户端与服务“连接”与正在实例化的服务类相同.....客户端没有连接到服务器或什么东西 - 当一个调用进来时,ServiceHost实例化服务类并调用方法 - 这就是所有...... – 2010-02-10 12:05:19

+0

对不起,我认为误解是由于我对WCF的了解不多。我试图用另一种方式来描述我需要的东西。 当我写“当客户端连接到服务时”我的意思是“当客户端调用open方法时”,然后在调用服务提供的方法之前。 我认为应该有一种方法来检测这个操作。 – 2010-02-10 13:02:45

相关问题