TimeoutException в WCF после нескольких вызовов

Может быть, я неправильно внедряю WCF, но я, кажется, получаю исключение WCF при использовании NetNamedPipedBindings после многочисленных звонков.

Вот высокий уровень того, что я делаю. По сути, я работаю над ex-proc exe и использую именованные каналы WCF для общения взад и вперед. Я оставляю свой хост открытым через этот атрибут:

[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single, 
    ConcurrencyMode = ConcurrencyMode.Multiple)]

Затем в моем клиенте я создаю static DuplexChannelFactory который я создаю один раз, а затем использую по мере необходимости через:

channelFactory.CreateChannel().MakeCall();

Я добавил метод Ping просто для того, чтобы убедиться, что хост работает должным образом (поскольку хост будет отправлять события, которые мы не хотим пропустить, не зная об этом). Этот метод Ping запускается каждые 5 секунд и просто возвращает true. Однако, после нескольких минут бега я получаю TimeoutException, Вот мой след исключения:

Трассировка стека сервера: в System.ServiceModel.Channels.ClientFramingDuplexSessionChannel.OnOpen (тайм-аут TimeSpan) в System.ServiceModel.Channels.CommunicationObject.Open(тайм-аут TimeSpan) в системном тайм-ауте System.ServiceModel.Channels.ServiceChannelSSpanpanChannelSSpanviceChannelSSpanviceChannelSSpan
в System.ServiceModel.Channels.CommunicationObject.Open(тайм-аут TimeSpan) в System.ServiceModel.Channels.ServiceChannel.CallOpenOnce.System.ServiceModel.Channels.ServiceChannel.ICallOnce.Call(канал ServiceChannelShannelShannelShannel в момент времени). ServiceChannel.CallOnceManager.CallOnce(тайм-аут TimeSpan, каскад CallOnceManager) в System.ServiceModel.Channels.ServiceChannel.EnsureOpened(тайм-аут TimeSpan) в System.ServiceModel.Channels.ServiceChannel.Call(операция на объекте, операция Onuntion, функция OnunOction, операция String,, Object[] outs, TimeSpan timeout) в System.ServiceModel.Channels.ServiceChannel.Call(String action, Boolean oneway, операция ProxyOperationRuntime, Object[] ins, Object[] outs) в System.ServiceModel.Channels.ServiceChannelProxy.InvokeService(IMethodCallMessage methodCall, операция ProxyOperationRuntime) в System.ServiceModel.Channels.ServiceChannelProxy.Invoke(сообщение IMessage)

Я открыл JustDecompile и вижу, что эта ошибка, скорее всего, происходит здесь:

connection = this.connectionPoolHelper.EstablishConnection(timeout)

Тем не менее, я не вижу никаких причин, по которым это может быть превышено время ожидания после работы на пару пингов ранее? Какие настройки мне нужно установить, чтобы сделать это бесконечным и / или есть ли другой способ для меня реализовать этот сервер событий WCF (он также используется для обработки по требованию) со стороны клиента или сервера?

ОБНОВИТЬ

Я делаю около 6 пингов до того, как начинаю видеть попытку вызова и никакого возврата.

2 ответа

Решение

Проблема заключалась в том, что вы не можете позвонить CreateChannel снова и снова это появляется. Нет метода утилизации, так как это просто прокси моего интерфейса WCF. Итак, я просто решил эту проблему, сохранив ссылку на прокси-сервер и воссоздав ее, если потребуется переустановить хост.

Вы могли бы подумать, что будет какая-то документация по этому поводу. Это особенно не помогает, когда есть блоги, в которых написано, что они несколько раз вызывают CreateChannel.

ОБНОВИТЬ:

Вот то, что я нашел относительно того, как это должно быть решено... хотя это не работало для меня.., но, кажется, для других

Отрезанный код в случае, если ссылка умирает:

Вы должны использовать использование, которое приводит к IClientChannel, а затем сбросить вашу ссылку внутри использования. Канал закроется правильно, но ваша ссылка останется открытой. Обратите внимание на приведения

using (IClientChannel client = (IClientChannel)channelFactory.CreateChannel())
{
    var proxy = (IMyInterface)client;
}

Вы должны использовать PipeList от sysinternals, чтобы убедиться, что вы создаете новые каналы без необходимости. Они будут отображаться как GUID. См. Блоги MSDN для дальнейшего ознакомления с соглашениями об именах именованных каналов WCF.

Другие вопросы по тегам