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





Каждый из ваших нескольких экземпляров консоли - это отдельный процесс, поэтому они получают свою собственную копию COM-объекта.
IIS и ваша веб-служба находятся в едином процессе, поэтому вы будете подчиняться правилам потоковой передачи COM. Возможно, используемый вами COM-объект помечен как однопоточный. Или он реализует одноэлементный шаблон, так что для каждого процесса существует только одна копия, и он может быть многопоточным. Вне зависимости от того, какой объект COM связан с потоком, только один поток может обращаться к нему за раз.
Правила, касающиеся COM и потоковой передачи, довольно сложны. Возможно, используемый вами COM-объект не был написан для нормальной работы в IIS.
Я, конечно, не знаком с объектом, с которым вы имеете дело, но это всего лишь идея: возможно ли для вас прокси-вызовы к COM-объекту через приложение COM +? Таким образом, вы можете установить желаемую модель потоковой передачи, а также сделать ее вне процесса (размещенной в dllhost.exe), поэтому IIS не придется бороться с ней как с внутрипроцессным сервером.
После дальнейшего расследования я обнаружил, что это проблема с веб-службой, работающей в квартире MTA, а COM находится в квартире STA. Эта статья прекрасно объясняет это ... http://msdn.microsoft.com/en-us/magazine/cc163544.aspx и дает решение, однако, когда я реализую это, похоже, что веб-сервис не перемещается в квартиру STA.
После дальнейшего расследования я обнаружил, что это проблема с веб-службой, работающей в квартире MTA, а COM находится в квартире STA. Эта статья прекрасно это объясняет ... msdn.microsoft.com/en-us/magazine/cc163544.aspx.