Проблема с веб-службой с использованием COM-объекта

У меня есть веб-служба VB.NET, которая вызывает COM-объект Interop. Когда я делаю несколько вызовов веб-службы одновременно, веб-служба обрабатывается нормально, пока не вызовет первый метод COM-объекта. На данный момент кажется, что вызовы COM-объекта помещаются в стек и обрабатываются по принципу FIFO. Таким образом, каждый вызов веб-службы задерживается до тех пор, пока не завершится обработка предыдущего.

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

Что мне нужно сделать, чтобы это правильно работало на стороне веб-сервисов? Веб-службы не должны ждать завершения COM в предыдущем вызове веб-службы, чтобы продолжить обработку.


person Community    schedule 21.01.2009    source источник
comment
При дальнейшем расследовании я обнаружил, что это проблема с веб-службой, работающей в квартире MTA, а COM находится в квартире STA. В этой статье это прекрасно объясняется... msdn.microsoft.com/en-us/ журнал/cc163544.aspx.   -  person    schedule 22.01.2009


Ответы (3)


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

IIS и ваша веб-служба находятся в одном процессе, поэтому вы будете подчиняться правилам потоков COM. Возможно, используемый вами COM-объект помечен как однопоточный. Или он реализует одноэлементный шаблон, так что для каждого процесса существует только одна копия, и она может быть многопоточной. Независимо от подходящего многопоточного COM-объекта, только один поток может обращаться к нему одновременно.

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

person Darryl Braaten    schedule 21.01.2009

Я, конечно, не знаком с объектом, с которым вы имеете дело, но просто идея: можно ли проксировать вызовы COM-объекта через приложение COM+? Таким образом, вы можете установить желаемую модель потоков, а также сделать ее вне процесса (размещенной в dllhost.exe), поэтому IIS не придется бороться с ней как с внутрипроцессным сервером.

person galets    schedule 22.01.2009

При дальнейшем расследовании я обнаружил, что это проблема с веб-службой, работающей в квартире MTA, а COM находится в квартире STA. В этой статье это прекрасно объясняется... http://msdn.microsoft.com/en-us/magazine/cc163544.aspx и дает решение, однако, когда я реализую это, кажется, что веб-служба не перемещается в квартиру STA.

person Community    schedule 22.01.2009