WCF NetTcpBinding проблемы тайм-аута - странное поведение
Я использую привязку NetTcpBinding (через Интернет), в которой для всех компонентов параллелизма и maxconnection задано высокое значение (4000 maxconnection, одновременных и т. Д.), Поэтому регулирование задано действительно высоким, и в действительности из счетчиков производительности wcf на сервере я вижу, что ни один из счетчиков параллелизма не переполнен, НО... но я испытываю кошмар тайм-аута, описанный ниже:
"Тайм-аут, который просто определяет, как долго вы должны ждать, чтобы служба фактически перестала работать, и выдает ошибку, но изменение значения этого тайм-аута не влияет на вероятность успеха. По существу, что-то происходит в течение первой секунды запрос на обслуживание, который запутывает вещи. Он никогда не восстановится. WCF не может магически повторить попытку сетевого подключения для вас. Хорошо, иногда установление сетевого подключения не проходит хорошо. Но, если ваше время ожидания составляет 2 часа, вам придется подождать 2 часа без шансов, что он когда-либо сработает, прежде чем он, наконец, признает, что он не сработал, и выдает ошибку ".
Я взял приведенное выше описание из этой темы, и это именно та проблема, которую я получаю.
Операторы выполняют одну и ту же операцию тысячи и тысячи раз в день, и иногда они принимают ошибку тайм-аута, даже если после того, как они могут выполнить ту же самую операцию быстро без какой-либо задержки, также в то время, когда кто-то получает тайм-аут на том же компьютере с другим экземпляром клиента они могут сделать звонок, и он идет быстро! И проверка ошибок на стороне сервера ничего не регистрируется в реализации сервиса и ничего не сохраняется в базе данных, поэтому методы никогда не вызывались по запросу, поэтому я абсолютно думаю о какой-то ошибке во время инициализации вызова, может быть, аутентификация, токенизация, криптование или что-то в этом слое, но я не могу найти ни одного кровавого сообщения об ошибке (возможно, включение трассировки wcf?).
В любом случае дело в том, что мы получили одно и то же старое программное обеспечение, написанное на классическом asp с обычным HTTP-запросом клиент-сервер, и таких проблем не бывает, даже если мы говорим об одном и том же подключении к Интернету, так что я должен думать? Интернет-исследователь делает что-то волшебное, когда появляются ошибки? WCF получил скрытую конфигурацию, которую я могу установить, чтобы улучшить это поведение? Что я могу сказать, так это то, что я пытался настроить нашу службу wcf в WsHttpBinding, и такого рода тайм-ауты никогда не происходят, даже если у нас все еще возникают некоторые ошибки, но соединение немедленно освобождается, даже если соединение довольно То же самое, что и соединение tcp, потому что по умолчанию wshttpbinding настроен для поддержки активности канала tcp, но я до сих пор не понимаю, почему с tcp я получаю такие таймауты.
Если кто-то может мне помочь, я буду очень признателен!
Спасибо!
2 ответа
Проблема была связана с плохим оборудованием, и было действительно трудно отлаживать, также с Wireshark (tcp sniffer) пакеты не показывали никаких особых ошибок, мы нашли некоторые tcp-повторы, и это могло быть симптомом, но на самом деле пакеты просто застряли где-то внутри модема-маршрутизатора, который был модемом связи (pirelli gate 2 plus), после смены модема / маршрутизатора проблема полностью исчезла.
В любом случае мы выяснили, что wsHttpBinding через http более надежен для интернет-соединения, где у вас нет контроля, и вы не можете быть уверены в том, какое оборудование установлено на сайте.
Надеюсь, что это может помочь и кому-то еще:)
Мы столкнулись с той же проблемой, но с WsHTTPBinding. Вы можете смоделировать описанный выше сценарий, вызвав одну и ту же операцию в цикле без явного закрытия клиентского соединения. Чтобы избежать этой проблемы, проверьте, закрываете ли вы клиентские подключения явно по завершении каждой операции, иначе запросы будут накапливаться на сервере. закройте клиент явно как client.Close().
Это исключит нагромождение запросов на сервере и повысит производительность приложения.