2009-05-28 7 views
15

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

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

Как увеличить тайм-аут и как? Какое лучшее решение?

ответ

4

У меня есть добавить следующий код в код Сервис приложения

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

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

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

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

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

+2

Похоже, что это позволило бы запросить 2 ГБ, чтобы связать поток для 30 минут, что делает его легкой мишенью для DDOS. – Webveloper

14

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

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

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

Это позволит установить тайм-аут до 3 минут.

Марк

+1

Нужно ли писать на обоих концах (конфигурация clien и конфигурация сервера)? – rmdussa

+0

Я пробовал с «00:30:00» все еще получаю ошибку Соединение сокета было прервано. Это может быть вызвано ошибкой обработки вашего сообщения или превышением времени приема удаленным хостом или проблемой сетевого ресурса. Локальный тайм-аут гнезда был «00: 29: 57.8030000». – rmdussa

+1

, но на самом деле это не дождаться 30 минут, это не удается через 1 минуту – rmdussa

61

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

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

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

+1

Я говорю об практическом опыте и 1. isuue - это тайм-аут (обработка обслуживания wcf на сервере базы данных, соответствующая процедура занимает более 2 минут) 2. список ответов returmns [] размер 400 элементов, если мы попытаемся вернуть 100 элементов Нет ошибки, если мы вернем полный список, а затем его заброшенную ошибку, тогда мы реализуем это из-за буфера размер. Если мы не увеличиваем время на стороне сервера, все равно его терпит неудачу, поэтому в моем случае приходится делать как – rmdussa

+0

. Я согласен, это шаблон, так как вы найдете разные решения для некоторых, а не для других. Для меня это было консольное приложение, которое я запускал, чтобы протестировать службу, отличную от WCF (на основе java). Это заняло millseconds в SoapUI, но займет минимум 3 секунды, а иногда и таймаутом, используя мое приложение. Я думаю, что пулы соединений и другие вещи, возможно, потребовали времени для инициализации при запуске приложения. Я установил свой SendTimeout на 5 минут, и теперь все в порядке. Примечание. Несколько вызовов службы в приложении (после ее запуска) произошло в миллисекундах. c.Endpoint.Binding.SendTimeout = новый TimeSpan (0, 5, 0); – MikeTeeVee

0

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

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

удачи.

0

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

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

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

1

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

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, которое передается от клиента к хосту.

1

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

+1

Вкратце: передайте объект, возвращенный из 'ChannelFactory .CreateChannel()' - который вы обычно вызываете ваши операции - в 'IContextChannel' (да, это работает) и установите для него свойство OperationTimeout. – ygoe

-3

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

+1

Полностью не применимо, используется для методов, которые ничего не возвращают! – dudeNumber4

-1

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

Смежные вопросы