ASP.NET会话和存储使用COM互操作的对象

时间:2008-10-08 20:51:19

标签: asp.net com session interop

我正在开发一个asp.net网站。我们必须使用com interop与传统的vb6 activex组件进行交互。在许多情况下,组件依赖于接收上下文对象(其本身是vb6 activex组件)作为参数。构造上下文对象的成本相当高。

因此,一个想法是上下文对象构造一次并存储在asp.net会话中。但是,如果此对象只是一个围绕activex组件的.net包装器,那么在会话中持久保存这样的对象是明智的还是可取的?

此外,上下文对象包含用户特定信息,因此可以使用.net HttpRuntime Caching持久化,但需要用户特定的密钥。

我了解使用asp.net session aspnet-session question时需要注意的其他限制和事项。

以稍微不同的方式提出问题:存储.net对象的任何问题或问题是否只是com对象的包装器?

2 个答案:

答案 0 :(得分:3)

我认为你很快会遇到一个请求阻止另一个请求的问题。

ASP.NET默认情况下在其线程上初始化COM以将线程放在多线程单元中。 VB6组件充其量只是公寓型号。这意味着当MTA线程创建组件时,如果已经存在(对于ASP.NET工作进程,它不会),则将其放入主STA中,或者专门为STA创建新线程。哪个MTA线程创建组件无关紧要,相同的STA始终用于无法处理MTA模型的组件。这意味着每个对这些组件的调用都使用相同的线程,因此并发调用必须排队等待。

告诉ASP.NET为单线程组件初始化COM,这至少会导致在与执行页面相同的线程上创建对象,将AspCompat属性添加到{{3}指令。

我不会缓存这些对象,因为它们在重用时很可能会出现跨线程问题。

答案 1 :(得分:0)

我会将它保留在缓存中,这样每个用户就不会构建一次,除非这是预期的效果。