WCF Windows Service TimeOut

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

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

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

Ответы

Ответ 1

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

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

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

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

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

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

Ответ 2

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

САМОЕ ВРЕМЯ, когда вы получаете это сообщение, это не имеет никакого отношения к фактическим таймаутам. Это могут быть квоты (количество объектов в графе, общий размер, длина массива) или что-то, что пошло не так на стороне сервера, между тем, как ваш метод службы вернул результат, и фактические байты были отправлены по проводу. Таким образом, вы должны проверить свои параметры конфигурации (а не таймаут, за исключением случаев, когда вам нужно было дождаться минуты, чтобы получить ошибку. Если вы получили ошибку сразу, это не имеет никакого отношения к тайм-аутам вообще).

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

Ответ 3

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

конфигурации:

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

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

Марк

Ответ 4

У меня возникла такая же ошибка. В частности, исключение, которое я получил, было:

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

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

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

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

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

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

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

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

Здесь атрибут Web.Config я имею в виду:

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

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

Ответ 6

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

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

Удачи.

Ответ 7

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

NetUtilsWCF.SMTPDiagClient sClient = новый NetUtilsWCF.SMTPDiagClient();

sClient.InnerChannel.OperationTimeout = новый TimeSpan (0, 5, 0);

Ответ 8

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

Ответ 9

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