Устранение неполадок C# WCF NET TCP, размещенного в IIS - PullRequest
0 голосов
/ 27 мая 2020
• 1000 подключения, а также на порт 8002 для net tcp-подключений; в конфигурации IIS для сайта привязки установлены на http:*:82:,net.tcp:8002:*

Однако, когда служба работает в течение нескольких часов, она перестает отвечать на порте net tcp (8002) - другие приложения, которые пытаются для подключения к нему истекает время ожидания:

System.TimeoutException: The open operation did not complete within the allotted timeout of 00:01:00. The time allotted to this operation may have been a portion of a longer timeout. ---> System.TimeoutException: The socket transfer timed out after 00:01:00. You have exceeded the timeout set on your binding. The time allotted to this operation may have been a portion of a longer timeout. ---> System.Net.Sockets.SocketException: A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond

Тем не менее, соединения с http-портом (82) по-прежнему работают должным образом, поэтому служба все еще работает.

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

Я не понимаю, как решить эту проблему дальше - есть предложения?

1 Ответ

0 голосов
/ 28 мая 2020

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

Вы можете просмотреть максимальное количество подключений для службы с помощью следующего кода:

        NetTcpBinding binding = new NetTcpBinding();
        Console.WriteLine(binding.MaxConnections);

Это ссылка ссылка для maxconnections:

https://docs.microsoft.com/en-us/dotnet/api/system.servicemodel.nettcpbinding.maxconnections?view=netframework-4.8

В службе WCF есть свойство servicethrottling, которое определяет механизм ограничения службы windows Communication Foundation (WCF). Вы можете предотвратить чрезмерное потребление ресурсов, установив serviceThrottling в службе.

В следующем примере конфигурации указано, что служба ограничивает максимальное количество одновременных вызовов до 2, а максимальное количество одновременных экземпляров - до 10.

enter image description here

Чтобы предотвратить чрезмерное потребление ресурсов, канал необходимо закрывать после каждого вызова со стороны клиента.

       ServiceReference1.Service1Client service1Client = new ServiceReference1.Service1Client();
        service1Client.GetData(0);
        service1Client.Close();

Для получения дополнительной информации о serviceThrottling перейдите по следующей ссылке:

https://docs.microsoft.com/zh-cn/dotnet/framework/configure-apps/file-schema/wcf/servicethrottling

...