Проблема с веб-сервисом, использующим COM-объект - PullRequest
0 голосов
/ 22 января 2009

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

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

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

Ответы [ 3 ]

1 голос
/ 22 января 2009

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

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

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

0 голосов
/ 22 января 2009

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

0 голосов
/ 22 января 2009

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

...