Я работаю над приложением winform, которое будет обращаться к службе WCF, самостоятельно размещенной в качестве службы Windows. Я использую ChannelFactory вместо ссылки на службу. Мне удалось подключиться и вызвать службу WCF. Проблема в том, что я разрешаю программе оставаться без дела в течение 20 минут, а затем попытаться сделать другой вызов. Я получаю следующую ошибку:Лучшая практика с WCF ChannelFactory и тайм-аут подключения
«Соединение сокета было прервано. Это может быть вызвано ошибкой обработки вашего сообщения или превышением времени приема удаленным хостом или основной проблемой сетевого ресурса. 00: 00: 59,9489970 «.
Я ищу наилучшую практику управления соединением. В настоящее время я создал функцию под названием PrepareWCFConnection (см. Ниже), которая проверяет состояние канала и ChannelFactory. Я вызываю этот метод, прежде чем делать какие-либо вызовы для служб WCF. Есть ли лучший способ справиться с этим?
public bool PrepareWCFConnection()
{
if ((channelFactory == null) ||
(channelFactory.State == CommunicationState.Faulted) ||
(channelFactory.State != CommunicationState.Opened))
{
channelFactory = new ChannelFactory<IService1>(new NetTcpBinding(), endpointAddress);
}
if ((proxy == null) ||
(((IClientChannel)proxy).State == CommunicationState.Faulted) ||
(((IClientChannel)proxy).State != CommunicationState.Opened))
{
proxy = channelFactory.CreateChannel(endpointAddress);
((IClientChannel)proxy).Open();
}
return true;
}
Больше испытаний вышеуказанного кода доказало, что оно не работает. Оба ChannelFactory и канал открыты, но я все еще получаю эту ошибку после того, как система простаивает: Соединение сокетов было прервано. Это может быть вызвано ошибкой обработки вашего сообщения или превышением времени приема удаленным хостом или проблемой сетевого ресурса. Локальный тайм-аут гнезда был «00: 00: 59.9479970». – econner
Вот ссылка от MSDN, которая показывает создание канала и канала, выполняет вызовы и закрывает канал, а затем закрывает канал. Однако, если вы используете кредитные права для аутентификации, не закрывал бы канал после каждого вызова метода и воссоздания канала до того, как каждый метод будет дорогостоящим по ресурсам и времени? http://msdn.microsoft.com/en-us/library/ms734681.aspx – econner
После тестирования больше я сначала запускаю вызов службы WCF с помощью PrepareWCFConnection() ... затем вызываю мой метод обслуживания, а затем вызываю ((IClientChannel) прокси) .close(); Это закрывает соединение канала, а затем создает новый канал для каждого вызова метода. Это лучшая практика? – econner