У меня очень странная проблема со старым унаследованным приложением, которое использует ASP.NET HTTP Handler и пользовательский пул потоков для создания и вызова STA COM-объектов.Серверы вне процесса EXE STA-серверы (FoxPro COM-серверы).
Это прикладная среда, которая запускает пул COM-объектов на выделенных (т. Е. Закрепленных) потоках и направляет входящие запросы в эти потоки, которые вызывают операционный код на компонентах STA COM.
Этоэто старый компонент, и он стабилен более 15 лет.Однако в последнее время поступают жалобы от клиентов, использующих большее количество экземпляров - в частности, 16 или более, - что при перезапуске или перезапуске IIS (IISRESET) COM-серверы STA часто не могут загружаться с:
COMобъект, который был отделен от лежащего в его основе RCW, не может быть использован.
Интересно то, что я не использую оболочку Runtime Callable, но непосредственно использую Reflection для доступа к COM-объектам.Не используется ни динамический, ни тип обертки.
При запуске менее 16 экземпляров никогда не возникает проблема с утилизацией / перезапуском. Запуск 16 или более проблем начинает возникать непоследовательно, когда IIS перезапускается или перезапускается (IISRESET).
Я могу надежно воспроизвести эту проблему на нескольких установках Server 2016.15 экземпляров не проблема, 16 или более повторных циклов в скором времени повесят пул.Я не смог продублировать проблему на локальной машине с Windows 10 даже с гораздо большим количеством потоков пула.
Если я возьму повторную очистку IIS из уравнения, я могу запустить 50 потоков / COM-серверов и выгрузить перезагрузить серверы в пуле под управлением приложения, и это отлично работает (не то, что когда-либо было бы полезно).
Однако рециркуляция IIS (которая запускает точно такой же путь выполнения) не делает.Единственное различие, о котором я могу подумать, заключается в том, что IIS выполняет ступенчатую остановку и запуск операции, когда один экземпляр Applicaiton Pool отключается, а другой запускается, поэтому на самом деле вдвое больше активных экземпляров , происходящих во времяутилизируется.
Мне кажется, что проблема связана с некоторым внутренним ограничением количества STA COM-серверов, которые могут быть созданы либо в рамках одного и того же процесса, либо, возможно, даже глобально в Windows (поскольку это происходит во время удвоения количества экземпляров).во время перезапуска процесса пула приложений начинается проблема), но я действительно нахожусь в темноте.
Кто-нибудь сталкивался с подобной ситуацией или знает о каких-либо ограничениях на ограничение создания объектов STA COM-объекта для процесса или наWindows Server?