Вызов STA COM-объекта из WebApi

Безопасна ли вызываемая оболочка среды выполнения С# для библиотеки типов удаленных приложений STA (с точки зрения модели потоков и квартир) для вызова из контекста потока MTA (запрос .Net WebApi)?

Должен ли я изменить серверное приложение STA на MTA, или RCW будет обрабатывать эти механизмы за кулисами?


person EProgrammerNotFound    schedule 18.11.2016    source источник


Ответы (1)


RCW — это прокси-сервер .NET для прокси-сервера COM. Неважно, в какой квартире вы находитесь в своем приложении .NET, RCW выполнит маршалинг вместо вас.

А так как объект удаленный, можно не волноваться, совместимы ли квартиры, общение пересекает процессы. Если вы будете использовать собственный язык и среду, например C++, вам нужно будет только побеспокоиться о том, чтобы не использовать прокси-сервер COM в разных подразделениях или, другими словами, правильно маршалировать ссылки на прокси в каждом подразделении.

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

Однако следует учитывать, какую квартиру использует другое приложение. Приложения, использующие STA, будут однопоточными, поэтому это будет узким местом для вашего приложения ASP.NET. Если он использует MTA, возможно, нет, если он не синхронизирует все вызовы или если критические секции работают быстро.

Для приложений вы обычно не можете контролировать используемую квартиру. Как бы вы изменили свою квартиру? Это компонент COM+? Это ваш код? Готовы ли они к смене квартиры?

person acelent    schedule 28.11.2016
comment
По сути, я бы перешел на свободный поток и применил некоторую блокировку в критических областях кода. Но этот механизм IPC используется редко по сравнению с другими функциями в приложении, поэтому производительность не будет проблемой. Думаю оставить как есть. - person EProgrammerNotFound; 29.11.2016
comment
У меня проблема в конструкторе класса RCW, он периодически вызывает type_e_cantloadlibrary, решает закрытие внепроцессного сервера, но это не качественное решение для производственной среды. Отсюда вопрос. - person EProgrammerNotFound; 29.11.2016
comment
Я полагаю, вы говорите о внутрипроцессном сервере (DLL), а не о внепроцессном сервере (EXE, DLL с использованием суррогата). Изменение зарегистрированной квартиры на внутрипроцессный сервер легко сделать в реестре, но сервер должен поддерживать этот тип квартиры. Изменение квартиры, используемой внепроцессным сервером (который не использует суррогат), обычно означает изменение кода или использование некоторых настроек, специфичных для приложения. - person acelent; 29.11.2016
comment
Что касается TYPE_E_CANTLOADLIBRARY, то библиотека типов может быть неправильно зарегистрирована или это внутрипроцессный сервер с разрядностью, отличной от хост-процесса. Попробуйте установить для параметра Включить 32-разрядные приложения значение True для пула приложений. Кроме того, если сервер является объектом Office, это официально неподдерживаемый сценарий. - person acelent; 29.11.2016
comment
В процессе находится только файл interop.xxxx.dll, сгенерированный tlbimp.exe. Мой автоматизированный объект находится вне процесса (т.е. порождает другой процесс), я в этом уверен. Не могли бы вы уточнить официально неподдерживаемый сценарий Office? возможно, мой автоматизированный объект попадает в ту же проблему. - person EProgrammerNotFound; 29.11.2016
comment
Спасибо за ваши комментарии и ваше время, я очень ценю вашу помощь. :-) - person EProgrammerNotFound; 29.11.2016
comment
это возможно связано? - person EProgrammerNotFound; 07.12.2016
comment
Нет, если вы не используете библиотеку вместо приложения. Можете ли вы предоставить регистрационные данные компонента, такие как запись CLSID и все значения в его подразделах, таких как InprocServer32, LocalServer и т. д.? Что касается неподдерживаемого сценария, то вот он: Соображения по автоматизации Office на стороне сервера. - person acelent; 07.12.2016
comment
Я думаю, что закрою этот вопрос как решенный и задам новый конкретно об исключении, что вы думаете? Я еще не принял, потому что я ждал больше голосов. Все, что я прочитал, подтверждает то, что вы сказали, но я просто ждал, чтобы убедиться, что это хорошо известно. - person EProgrammerNotFound; 07.12.2016
comment
Я считаю, что если ответ удовлетворяет вопрос с точки зрения оператора (вашей в данном случае), его следует принять. Обычно практические вопросы по программированию легче проверить и принять по сравнению с более абстрактными вопросами и/или ответами. Время, которое оператор решает дать, в основном, если он считает, что другие могут вмешаться с более удовлетворительными ответами или комментариями к уже достаточно хорошим ответам. Вам не нужно ждать, вы все равно должны опубликовать новый вопрос, вы можете оставить принятие ответа на этот вопрос на потом. - person acelent; 07.12.2016
comment
Проблема с библиотекой типов была связана с тем, что я подключался к RDP-серверу с несколькими/разными пользователями, внешнее приложение регистрировалось каждый раз для другого пользователя, когда они отлаживали веб-приложение. Этого, вероятно, не произойдет в prod, поэтому я просто запишу эту проблему и рискну... Я оставлю как есть. - person EProgrammerNotFound; 29.09.2017