WCF - проблема с channels
От: bsp-sound Беларусь  
Дата: 22.03.10 08:03
Оценка:
Здравствуйте!

У меня клиент-сервер приложение. Для обмена использую contracts(duplexchannel). Проблема в том, что ПОСЛЕ отправки данных на сервер, контракт выдает одну из этих ошибок (причем не систематически, может за час работы раз-два, а может за день ни одной):

1) Коммуникационный объект System.ServiceModel.Channels.ServiceChannel нельзя использовать для связи, так как его работа прервана.
2) Данный канал больше не может использоваться для отправки сообщений, так как выходной сеанс был закрыт автоматически в результате отключения, инициированного сервером. Либо выключите режим автоматического закрытия, установив DispatchRuntime.AutomaticInputSessionShutdown на false, либо измените протокол отключения с удаленным сервером.

Искал по MSDN "DispatchRuntime.AutomaticInputSessionShutdown" — что-то нашел... Но как прикрутить к приложению — там не рассмотрено.

Почему канал отрубается/закрывается "когда ему угодно"? Может кто сталкивался с такой проблемой?
Re: WCF - проблема с channels
От: Хэлкар  
Дата: 22.03.10 08:17
Оценка:
Если я правильно понял, то проблема в таймаутах. К сожалению эта проблема в прямую не решается. Надо либо делать пустой метод типа Ping, который будет раз в минуту напоминать серверу что подключение еще живо. Кроме того можно подписаться на событие кнала Faulted и переподключаться при срабатывании.
Re[2]: WCF - проблема с channels
От: Хэлкар  
Дата: 22.03.10 08:18
Оценка:
Да, еще возможно надо бвыставить ConcurrencyMode = ConcurrencyMode.Multiple или Reentrant.
Re: WCF - проблема с channels
От: Jolly Roger  
Дата: 22.03.10 10:20
Оценка:
Здравствуйте, bsp-sound, Вы писали:

BS>Искал по MSDN "DispatchRuntime.AutomaticInputSessionShutdown" — что-то нашел... Но как прикрутить к приложению — там не рассмотрено.


Попробуйте так

public class MyBehavior : IEndpointBehavior
{
    public void AddBindingParameters(ServiceEndpoint endpoint,
        BindingParameterCollection bindingParameters)
    {
    }
    public void ApplyClientBehavior(ServiceEndpoint endpoint,
        ClientRuntime clientRuntime)
    {
    }
    public void ApplyDispatchBehavior(ServiceEndpoint endpoint,
        EndpointDispatcher endpointDispatcher)
    {
        endpointDispatcher.DispatchRuntime.AutomaticInputSessionShutdown = false;
    }
    public void Validate(ServiceEndpoint endpoint)
    {
    }
}

И после создания хоста и точки
endPoint.Behaviors.Add(new MyBehavior());

или
foreach (var endPoint in host.Description.Endpoints)
    endPoint.Behaviors.Add(new MyBehavior());
"Нормальные герои всегда идут в обход!"
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.