У нас есть клиент-сервер. net приложение с Oracle БД. Следующая проблема возникает только в определенной пользовательской среде c, поэтому, вероятно, не проблема с приложением.
После выполнения одного и того же действия определенное c количество раз мы получаем несколько тайм-аутов от вызовов службы. Под действием я подразумеваю серию сервисных вызовов для проверки, дефолта, вставки. (Это экран WPF, в котором вы заполняете кучу данных, а затем сохраняете их). Таким образом, я могу выполнить одно действие идеально 12 раз из 13 раз, когда приложение зависает, и через некоторое время мы получаем тайм-ауты. Это всегда будет 13 раз (даже если между ними предприняты другие действия), однако вызов службы, для которого происходит тайм-аут, отличается (но все они выполняются асин c). Только закрытие клиентских приложений помогает решить проблему.
Запуск клиентского приложения на другом компьютере не оказал влияния, но я провел тест, где я размещал серверное приложение на своем компьютере и подключался к клиентской БД ru тогда проблема не возникла.
Я заметил, что некоторые вызовы службы, которые по тайм-ауту, никогда не отображались в fiddler (так что кажется, что запрос никогда не отправлялся)
Я сделал немного погуглил и наткнулся на https://docs.microsoft.com/en-us/windows/client-management/troubleshoot-tcpip-port-exhaust
Я использовал
Get-NetTCPConnection | Group-Object -Property State, OwningProcess | Select -Property Count, Name, @{Name="ProcessName";Expression={(Get-Process -PID ($_.Name.Split(',')[-1].Trim(' '))).Name}}, Group | Sort Count -Descending
на клиентском компьютере и увидел, что клиентское приложение имеет много связанных соединений.
Я запустил новое клиентское приложение и проделал то же действие, что и раньше, 13 раз. Я заметил, что Связанные соединения увеличивались после каждого действия с + - 8 соединениями. Он продолжал увеличиваться, и когда в действии 13 произошли тайм-ауты, Связанные соединения прекратились между 115-120 и не стали выше.
Это поведение, которое происходит только для этого конкретного c клиента. Когда я проводил тест с размещением серверного приложения на моем компьютере, связанные порты не превышали 40, а через несколько раз даже снижались. То же самое для других клиентских сред.
Интересно отметить, что если я впервые сделал несколько других обращений в службу поддержки и начал свои 13 действий, когда привязанные соединения уже были на 50 или около того, тайм-ауты по-прежнему происходили только на 13 и общее количество связанных подключений было около 140 +.
Выход для Get-NetTCPConnection выглядит следующим образом Выход Get-NetTCPConnection Также, когда я использую инструменты, такие как netstat или CurrPorts, эти подключения не получают
(Исправление: netstat -anoq отображает их, netstat -anob нет)
Другие вещи, которые я проверял:
- Выполнение запросов списка appcmd на сервере приложений не показывал запущенный запрос
- Используя TCPView на клиенте, я видел только установленное соединение и ни одно из 120 связанных подключений. Это нормально?
- Используя TCPView на сервере приложений, я увидел установленные соединения для серверного приложения, но здесь нет ничего особенного. Только много системного процесса с PID 0, но я читал, что это нормально.
Кто-нибудь лучше понимает, почему это может произойти и как это исправить?
Google также узнал, что это может быть связано с брандмауэром, который сбрасывает TCP-соединения, не сообщая клиенту. Есть ли способ узнать это наверняка?