2011-11-02 36 views
3

所以我试图在具有多个AppDomain的应用程序中设置一个记录器。我想在内存中为所有记录的消息创建一个中央存储。我决定使用名为管道绑定的WCF,并创建了一个log4net appender,它创建一个通道并将所有日志事件发送到主服务。跨应用程序域的多个服务实例

问题是我似乎得到每个AppDomain中的服务的新副本,因此我的单个日志最终成为多个日志。

的设置是我有一个服务合同接口,ILogSink,和单身(单身实际和InstanceContextMode在服务行为属性设置为单)服务实现ResultLog它可以对记录的消息的集合。在我的父AppDomain中,我实例化ServiceHostResultLog,并打开该服务。然后我附上一个Appender WcfResultAppender,它具有通过ChannelFactory CreateChannel调用(到服务主机地址)创建的代理副本ILogSink。在启动时,每个子AppDomain都会创建它自己的WcfResultAppender副本。

我对WCF很陌生,我错过了什么?

编辑:我还没有收到任何好的回应 - 我已经把问题放在一边,但它是一个迫切的需要。看起来好像我在每个应用程序域中都获得了不同的服务类副本,并且出于某种原因数据仍留在这些对象中。我预计后台会有一些东西使用绑定来解决在主AppDomain中创建的服务,并通过该服务传递数据,但其他事情正在发生。我已经阅读了无数WCF的解释和例子 - 我注意到的一件事是没有一个例子提供保留数据的服务。但是,我仍然无法找到任何与我的期望相矛盾或确认的东西。

+0

你是如何托管你的单身人士? –

+0

暂时有一个处理程序类,它具有对单例服务以及单个AppDomain的引用。我正在实例化单例以及处理程序中的服务主机。最终,我会重构这个以启动并托管这个级别以上的单例,但现在我正在使用一个创建的处理程序/ appdomain进行测试。 – badlander

回答

1

每个AppDomain都是一个孤立的环境,它们之间没有直接的交互作用。

考虑通过IIS或WAS公开您的服务,它将在其自己的(单个)AppDomain中运行它。如何在IIS中托管WCF服务的详细信息,请参阅http://msdn.microsoft.com/en-us/library/ms733766.aspx

有关如何在WAS中托管WCF服务的详细信息,请参阅http://msdn.microsoft.com/en-us/library/ms733109.aspx

希望这会有所帮助。

+0

我想我误解了一些关于它如何工作的基本知识。我的期望是,我设置了一个服务来监听指定的管道位置,然后通过命名的管道uri打开一个到该服务的通道,并独立于任何应用程序域甚至应用程序连接到该服务。如果情况不是这样,你能解释一下真正的情况吗?如果客户依赖于情境,这似乎会破坏独立服务的目的...... – badlander

+0

@badlander ServiceHost类允许您在未将其托管在IIS或WAS中时公开服务[link](http://msdn.microsoft.com/zh-cn/library/system.servicemodel.servicehost.aspx)它不知道哪个其他服务实现当前被托管在另一个AppDomain中。您正在为每个AppDomain创建和托管单个服务实例。 –

+0

@badlander对于WCF上的有用资源,请参阅http://stackoverflow.com/tags/wcf/info –

0

考虑使用消息队列作为日志消息的存储