【发布时间】:2012-02-14 09:34:12
【问题描述】:
我们的 .NET 应用程序使用 2 个 AppDomain。辅助域需要访问在主 appdomain 中创建的 Logger 对象。
此记录器通过具有命名管道绑定的 WCF 服务公开。
这就是我为此服务创建“客户端”的方式:
private void InitLogger()
{
if (loggerProxy != null)
{
Logger.Instance.onLogEvent -= loggerProxy.Log;
}
// Connect to the logger proxy.
var ep = new EndpointAddress("net.pipe://localhost/app/log");
var binding = new NetNamedPipeBinding(NetNamedPipeSecurityMode.None);
//Logger.Debug("Creating proxy to Logger object.");
var channelFactory = new ChannelFactory<ILogProvider>(binding, ep);
loggerProxy = channelFactory.CreateChannel();
channelFactory.Faulted += (sender, args) => InitLogger();
channelFactory.Closed += (sender, args) => InitLogger();
Logger.Instance.onLogEvent += loggerProxy.Log;
}
最近我们收到了随机的 CommunicationObjectFaultedException - 我想这是因为通道超时或由于我失踪的其他原因而发生的。
这就是我添加 Closed 和 Faulted 事件处理的原因,这些事件似乎无法正常工作(也许我没有正确使用它们)。
编辑:这些事件按照建议在 Factory 对象上,所以这解释了为什么它们没有被引发。
我的问题是 -- 我怎样才能避免这些错误?
我们的场景是我们需要在应用程序的整个生命周期中一直保持这个通道打开,并且需要随时访问这个 Logger 服务,并且在任何情况下都不应该超时。
有处理这种情况的安全做法吗?
【问题讨论】:
标签: c# .net wcf named-pipes