我有一个调用Interop COM对象的VB.NET Web服务。当我同时多次调用Web服务时,Web服务处理正常,直到它调用COM对象的第一个方法。此时,似乎对COM对象的调用放在堆栈上,并且它们以FIFO为基础进行处理。因此,每个Web服务调用都会一直存在,直到前一个完成处理。
在调用使用COM库的类库之前,我在控制台应用程序端做了同样的事情,您可以同时使用相同的Interop COM对象运行多个控制台应用程序,没有任何问题。
为了让它在Web服务方面正常运行,我需要做些什么? Web服务不必等待COM在之前的Web服务调用中完成,以便继续处理。
答案 0 :(得分:1)
您的多个控制台实例都是他们自己的进程,因此他们可以获得自己的COM对象副本。
IIS和您的Web服务只在一个进程中,因此您将受到COM线程规则的约束。可能是您正在使用的COM对象标记为单线程。或者它实现了一个单例模式,因此每个进程只存在一个副本,并且它是apt线程的。无论一个apt线程COM对象,一次只能有一个线程访问它。
围绕COM和线程的规则相当复杂,它们使用的COM对象可能没有被编写为在IIS下运行良好。
答案 1 :(得分:0)
我当然不熟悉您处理的对象,但只是一个想法:您是否可以通过COM +应用程序代理对COM对象的调用?通过这种方式,您可以设置所需的线程模型,也可以将其设置为进程外(在dllhost.exe中托管),因此IIS不必与进程内服务器进行对抗
答案 2 :(得分:0)
经过进一步调查,我发现这是在MTA公寓中运行的Web服务的问题,而COM位于STA公寓中。这篇文章很好地解释了...... http://msdn.microsoft.com/en-us/magazine/cc163544.aspx并给出了解决方案,但是,当我实现它时,似乎并没有将Web服务移动到STA公寓。