WCF не правильно рассчитывает время?
У меня проблема с тайм-аутом, это детали:
Моя конфигурация привязки выглядит так:
<netTcpBinding>
<binding name="WindowsServerOverTcp"
maxReceivedMessageSize="10000000"
maxBufferSize="10000000"
maxBufferPoolSize="10000000"
closeTimeout="00:00:03"
openTimeout="00:00:03"
sendTimeout="00:00:03"
receiveTimeout="00:00:03">
<readerQuotas maxDepth="2147483647" maxStringContentLength="2147483647"
maxArrayLength="2147483647" maxBytesPerRead="2147483647"
maxNameTableCharCount="2147483647" />
<security mode="None">
</security>
</binding>
</netTcpBinding>
Я отправляю сообщение на сервер, который, как я знаю, отключен, поэтому время ожидания соединения должно истечь через 3 секунды, как указано в моем app.config, но по какой-то причине это занимает 20-30 секунд.
Когда выдается исключение EndPointNotFoundException, это информация, которую я получаю:
System.ServiceModel.EndPointNotFoundException: Не удалось подключиться к net.tcp://10.0.0.82:4466/MegaMatcherWcf. Попытка подключения длилась в течение 00:00:03. Код ошибки TCP 10060: попытка подключения не удалась, потому что подключенная сторона не ответила должным образом через определенный промежуток времени, или не удалось установить соединение, так как подключенный хост не ответил 10.0.0.82:4466
Если я пытаюсь выполнить тот же тест с включенным аппаратом, но не работающим программным обеспечением для прослушивания, я получаю ожидаемое поведение с истечением времени ожидания соединения через 3 секунды. Почему, если машина выключена, это занимает 30 секунд, а затем скажите мне, что это заняло 3 секунды?
3 ответа
Я полагаю, что вы сейчас имеете дело с проблемой тайм-аута Windows, а не с тайм-аутом WCF. Windows займет 20-30 секунд, чтобы определить, что машина не отвечает в сети. Когда вы звоните на сервер WCF, Windows сначала должна установить маршрут к серверу. Когда он не может, он предупреждает ваше программное обеспечение, и ваше программное обеспечение думает, что оно достигло своего времени ожидания. Ваша система никогда не доходит до момента фактического опроса, чтобы увидеть, работает ли служба, потому что Windows все еще пытается найти что-то на другом конце этого IP-адреса.
Чтобы быть немного более конкретным, чем @BiggsTRC (ответ которого в целом правильный):
- Делегаты WCF
System.Net.Sockets
классифицирует детали установления соединения транспортного уровня в канале NetTcpBinding; System.Net.Sockets
является оберткой вокруг неуправляемого API-интерфейса WINSOCK;- WINSOCK API имеет внутренние тайм-ауты по умолчанию, но не предоставляет никакого документированного механизма для указания тайм-аута для определенных операций блокировки, включая
WSAConnect()
, который.NETSocket.Connect()
метод использует; - Код WCF (в
System.ServiceModel.Channels.SocketConnectionInitiator.Connect()
) звонкиSocket.Connect
и, если это вызывает исключение определенных типов, он проверяет, есть ли оставшееся время в периоде ожидания соединения. Если нет, вы получитеEndpointNotFoundException
с сообщением об ошибке, которое вы видели; - WCF использует
TimeoutHelper
класс, чтобы отслеживать периоды времени ожидания и делать арифметику времени. У этого есть метод, который называетсяElapsedTime
, но это неправильное значение, поскольку оно никогда не возвращает значение, превышающее исходный период ожидания: именно поэтому сообщение об ошибке указывает вам, сколько времени заняла попытка подключения.
WCF может применить свои настроенные тайм-ауты, используя асинхронные методы Sockets API, отслеживая тайм-аут в отдельном потоке для попытки подключения, но в настоящее время этого не происходит. Если вы считаете, что это ошибка (которая, возможно, и есть), вы можете сообщить об этом на сайте Microsoft Connect и, возможно, исправить ее в будущей версии или пакете обновлений.
Я столкнулся с той же проблемой
Сделал все, попробовал каждую конфигурацию, ничего не помогло.
net.tcp через интернет истекает, как ад
единственное, что мне помогло, это когда я использовал
Шаблон обмена дуплексными или обратными вызовами