Служба Windows WCF TimeOut - PullRequest
       36

Служба Windows WCF TimeOut

16 голосов
/ 28 мая 2009

У меня есть клиентское приложение, разработанное в .net, которое отправляет запрос в службу wcf и должно отправить ответ. Если время выполнения составляет 1 минуту, ошибки нет, если она превышает 1 минута ошибка

Внутреннее исключение: эта операция запроса отправлена ​​на net.tcp: // localhost: 18001 / PitToPort / 2008/01/30 / StockpileService / tcp не получила ответ в течение настроенного времени ожидания (00:01:00).
Время, отведенное для этой операции, могло быть частью более длительного времени ожидания. Это может быть связано с тем, что служба все еще обрабатывает операцию или службе не удалось отправить ответное сообщение. Пожалуйста, рассмотрите возможность увеличения времени ожидания операции (путем преобразования канала / прокси в IContextChannel и установки свойства OperationTimeout) и убедитесь, что служба может подключиться к клиенту

Как увеличить время ожидания и как? Какое лучшее решение?

Ответы [ 9 ]

62 голосов
/ 03 июня 2009

Будьте осторожны, это сообщение об ошибке представляет собой шаблонную строку, которую отправляет WCF, когда не имеет ни малейшего представления о том, что произошло. Это на самом деле означает «что-то не так в цепочке, но я не совсем уверен, что, так что вот некоторые мелочи о конфигурации, делайте с ней что хотите».

БОЛЬШЕ ВРЕМЕНИ, когда вы получаете это сообщение, оно не имеет никакого отношения к фактическим тайм-аутам. Это могут быть квоты (количество объектов в графе, общий размер, длина массива) или что-то, что пошло не так на стороне сервера, между временем, когда ваш сервисный метод возвратил результат, и фактическими байтами, отправленными по проводам. Поэтому вам следует проверить настройки вашей конфигурации (а не тайм-аут, за исключением того, что вам пришлось подождать одну минуту, чтобы получить ошибку. Если вы получили ошибку сразу, это никак не связано с таймаутами).

Это бесполезное сообщение находится в начале моего списка раздражений WCF.

14 голосов
/ 28 мая 2009

Тайм-аут называется «sendTimeout», и вы можете настроить его в своем разделе привязки в своем конфигурационном файле или в коде - на ваш выбор.

конфиг:

  <system.serviceModel>
    <bindings>
      <netTcpBinding>
        <binding sendTimeout="00:03:00" />
      </netTcpBinding>
    </bindings>

Это установит тайм-аут на 3 минуты.

Марк

4 голосов
/ 03 июня 2009

Я добавил следующий код в код приложения службы

system.transactions  
    defaultSettings timeout="00:30:00" 

с этим кодом служба будет ждать 30 минут для завершения процесса на сервере базы данных и увеличить

maxBufferSize="2147483647"  
maxReceivedMessageSize="2147483647"  
maxBufferPoolSize="2147483647" 

в атрибутах привязки клиента, тогда он работает нормально.

Проблема: служба отправляет ответ, но размер буфера клиента раньше был меньше, я увеличил до максимального размера буфера.

1 голос
/ 16 сентября 2011

Проверьте это, для подобного типа ошибки вы должны установить свойство OperationTine out http://www.codeproject.com/KB/WCF/WCF_Operation_Timeout_.aspx

1 голос
/ 24 августа 2011

Я испытал эту же ошибку. В частности, я получил исключение:

System.ServiceModel.CommunicationException: соединение с сокетом было прервана. Это может быть вызвано ошибкой обработки вашего сообщения или превышен тайм-аут удаленного хоста или базовый проблема сетевого ресурса. Тайм-аут локального сокета был '00: 09: 59.9940000 '.

System.IO.IOException: операция записи не выполнена, см. Внутреннюю исключение.

System.ServiceModel.CommunicationException: соединение с сокетом было прервана.

Это может быть вызвано ошибкой обработки вашего сообщения или получения превышен тайм-аут удаленного хоста или базовой сети вопрос ресурса.

Тайм-аут локального сокета был '00: 09: 59.9940000 '.

System.Net.Sockets.SocketException: существующее соединение было принудительно закрывается удаленным хостом

Причина моей проблемы была из-за размера сообщения, которое было отправлено с моего клиента WCF на хост WCF. Видимо, размер сообщения был слишком большим.

Чтобы решить эту проблему, я изменил атрибут hosts.Fefig maxReceivedMessageSize с 2097152 на 8000000, и ошибка больше не сохраняется.

Вот атрибут Web.Config, на который я ссылаюсь:

<netTcpBinding>
<binding name="NetTCPBinding" maxReceivedMessageSize="8000000">
....
</binding>
</netTcpBinding>

Размер сообщения 8M, который я выбрал, основывался на том, насколько большим «я думаю» является размер сообщения. Я не знаю способа явно определить размер фактического сообщения WCF, которое передается от клиента к хосту.

0 голосов
/ 30 января 2013

Я получил то же исключение при использовании callback. Он работает в локальном тесте (клиентская и служебная программы работают на одном компьютере), но не работает в пользовательской среде (служебная программа работает в winserver 2008). Код сервера был выполнен в соответствии с журналом. Я думаю, что это из-за проблем со средой или полномочиями, но не знаю, как с этим справиться.

0 голосов
/ 09 ноября 2011

Если вы столкнулись с проблемой после исправления файла конфигурации, возможно, вам придется проверить этот атрибут. "OperationContract(IsOneWay:=True)". Если вы пропустите атрибут IsOneWay:=True, это может вызвать эту проблему.

0 голосов
/ 29 апреля 2010

Вот гораздо более простое решение ... просто установите свойство непосредственно в текущей ClientBase. Другими словами, сначала добавьте ссылку на службу, инициализируйте ее, затем установите свойство "InnerChannel.OperationTimeout"

NetUtilsWCF.SMTPDiagClient sClient = new NetUtilsWCF.SMTPDiagClient ();

sClient.InnerChannel.OperationTimeout = new TimeSpan (0, 5, 0);

0 голосов
/ 10 сентября 2009

Если вы знаете, почему серверу требуется больше минуты, чтобы ответить клиенту, вам следует расширить OperationTimeout канала (как указано в сообщении об ошибке).

Проверьте это, включая пример кода в конце: http://final -proj.blogspot.com / 2009/09 / ФОС-timeouts.html

Удачи.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...