0

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

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

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

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

以稍微不同的方式问这个问题:他们在存储一个只是 com 对象的包装器的 .net 对象方面是否存在任何问题或问题?

4

2 回答 2

3

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

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

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

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

于 2008-10-08T21:47:37.093 回答
0

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

于 2008-10-08T20:52:40.870 回答