Вопрос по publish-subscribe, callback, .net, wcf – Делать обратные вызовы WCF TimeOut

11

Я написал систему, которая использует дуплексный канал NetTcp с обратным вызовом для функционирования в качестве сервера публикации / подписки.

Должен ли я беспокоиться о тайм-ауте обратного вызова, если через некоторое время соединение не отправляется или канал обратного вызова будет поддерживаться бесконечно?

Ваш Ответ

1   ответ
10

он будет искать значения тайм-аута, которые вы установили в своей конфигурации. Если вы включаете надежные сеансы, вы можете установить таймауты неактивности ваших клиентов. Вы можете настроить время ожидания следующим образом:

 <netTcpBinding>
    <binding 
             closeTimeout="00:01:00"
             openTimeout="00:01:00" 
             receiveTimeout="00:10:00" 
             sendTimeout="00:01:00"
             transactionFlow="false" 
           ......>
        <reliableSession ordered="true" inactivityTimeout="00:10:00" enabled="true" />
    </binding>
  </netTcpBinding>

Когда эти значения достигнуты, а ответ по-прежнему отсутствует, ваш канал связи выходит из строя, и вам необходимо заново создать клиентский прокси-сервер для использования службы. Значение по умолчанию дляreceiveTimeout 10 минут, так что вы можете увеличить это, но и обязательно увеличитьinactivityTimeout а вашinactivityTimeout должно быть больше, чем вашreceiveTimeout.

EDIT:

Вы могли бы продолжать менять свойreceiveTimeout программно на основе значений, которые ваш клиент отправляет обратно на сервер, ключnew значения времени ожидания одинаковы для службы и клиента. Вы можете сделать это на клиенте (пример, который я беру из службы чата, которую я создаю с помощью WCF и использую с клиентами Silverlight):

//Create different clients dynamically
MyChatServiceClient _client1 = new MyChatServiceClient( "NetTcpBinding_IMyChatService_1");
MyChatServiceClient _client2 = new MyChatServiceClient( "NetTcpBinding_IMyChatService_2");

В конфигурации клиента:

<!--In your config file, define multiple endpoints/behaviors with different values based on your needs-->
        <bindings>
            <customBinding>
                <binding name="NetTcpBinding_IMyChatService_1" receiveTimeout="00:01:00" ...>
                    <binaryMessageEncoding />
                    <tcpTransport maxReceivedMessageSize="283647" maxBufferSize="283647" />
                </binding>
                <binding name="NetTcpBinding_IMyChatService_2" receiveTimeout="00:22:00" ...>
                    <binaryMessageEncoding />
                    <tcpTransport maxReceivedMessageSize="2147483647" maxBufferSize="2147483647" />
                </binding>
            </customBinding>
        </bindings>
        <client>
            <endpoint address="net.tcp://192.168.1.51:4520/VideoChatServer/"
                binding="customBinding" bindingConfiguration="NetTcpBinding_IMyChatService_1"
                contract="IMyChatService" name="NetTcpBinding_IMyChatService_1" />

          <endpoint address="net.tcp://192.168.1.51:4522/VideoChatServer/"
                binding="customBinding" bindingConfiguration="NetTcpBinding_IMyChatService_2"
                contract="IMyChatService" name="NetTcpBinding_IMyChatService_2" />
        </client>

Таким образом, вы можете определить несколько конечных точек или привязок в конфигурации на вашем клиенте или сервере, а затем на основе любого событие в вашем приложении, вы можете создать экземпляр _clientProxyX для использования _serviceInstanceX, который будет иметь различные значения привязки / конечной точки но тот же контракт, что и вашprevious экземпляр службы. В приведенном выше примере время первой привязки составляет 1 минуту, вторая привязка 2 минуты. Важным моментом, который следует учитывать, является то, что если вы хотите воссоздать новые клиентские прокси-серверы, как это, то вам нужно демонтировать старый клиент  прокси и ящик новый, который эффективно отключает ваших клиентов от службы, по крайней мере, на мгновение.

Также вы можете изменить эти значения (openTimeout, closeTimeout и т.д.) программно на обоих серверах при создании нового хоста службы. Вы можете создать новый хост на основе одной из конфигураций привязки, которые вы определили в вашей конфигурации,  или создайте новый конфиг программно, что-то вроде этого:

var host = new ServiceHost(typeof(MyChatService));
            var webHttpBinding = new System.ServiceModel.WebHttpBinding();
            //Modify new timeout values before starting the host
            webHttpBinding.OpenTimeout = new TimeSpan(1, 0, 0);
            webHttpBinding.CloseTimeout = new TimeSpan(1, 0, 0);
            host.AddServiceEndpoint(webHttpBinding, "http://192.168.1.51/myService.svc");
            //start the host after necessary adjustments
            host.Open();

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

Я хочу обрабатывать периодические события, было бы приемлемой практикой иметь & quot; Keep-Alive & quot; сообщение приходит с сервера каждые х минут и установить время 2 * х? Omar Kooheji
Таким образом, вы хотите продолжать изменять receiveTimeout в зависимости от того, что ваш клиент возвращает на сервер правильно? Я не делал этого раньше, но я не думаю, что это обязательно плохая практика. Почему бы вам просто не установить тайм-ауты на "бесконечно"? Вы также можете сделать это программно следующим образом: binding.ReceiveTimeout = new TimeSpan (300,0,0,0,0); это сделает ваш receiveTimeout 300 дней.

Похожие вопросы