Наше приложение .NET использует 2 домена приложений. Вторичный домен нуждается в доступе к объекту 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;
}
Недавно мы получаем случайное исключение CommunicationObjectFaptedException - я полагаю, это происходит с момента истечения срока действия канала или по какой-то другой причине, по которой я пропускаю.
По этой причине я добавил обработку событий Closed и Failed , которые, кажется, не работают должным образом (возможно, я не использовал их надлежащим образом).
РЕДАКТИРОВАТЬ: Эти события находятся на объекте Factory, как это было предложено, поэтому это объясняет, почему они не вызываются.
Мой вопрос - как мне избежать этих ошибок?
Наш сценарий заключается в том, что нам нужно постоянно держать этот канал открытым на протяжении всего жизненного цикла приложения, а доступ к этой службе Logger необходим всегда и не должен прерываться ни при каких обстоятельствах.
Существует ли какая-либо безопасная практика обращения с подобными ситуациями?