ASP.NET session and storing objects that use COM interop
我在一个ASP.NET网站上工作。我们必须使用COM互操作来与旧的VB6 ActiveX组件交互。在许多情况下,组件依赖于接收一个上下文对象(它本身就是一个VB6 ActiveX组件)作为参数。上下文对象的构造成本相当高。
因此,有一种想法是,只构造一次上下文对象,并将其存储在ASP.NET会话中。但是,如果这个对象只是一个围绕ActiveX组件的.NET包装器,那么在会话中持久保存这样的对象是明智的还是明智的?
此外,Context对象包含用户特定的信息,因此可以使用.NET httpruntime缓存进行持久化,但需要用户特定的密钥。
我了解ASP.NET会话、ASPNET会话问题的其他限制和需要注意的事项。
以一种稍微不同的方式问这个问题:他们在存储一个仅仅是COM对象包装器的.NET对象时是否有任何问题或问题?
我认为您很快就会遇到一个请求阻塞另一个请求的问题。
默认情况下,ASP.NET在其线程上初始化COM,以将线程放入多线程单元中。VB6组件充其量是公寓模型。这意味着,当MTA线程创建组件时,如果已经存在一个组件(对于ASP.NET工作进程,它不会),或者为STA专门创建了一个新线程,则会将其放入主STA。不管哪个MTA线程创建组件,相同的STA总是用于无法处理MTA模型的组件。这意味着对这些组件的每次调用都使用相同的线程,因此并发调用必须排队等待。
要告诉ASP.NET初始化单线程组件的COM,这至少会导致在与执行页相同的线程上创建对象,请将
我不会缓存这些对象,因为它们在重用时很可能会出现跨线程问题。
我将把它保存在缓存中,这样就不会为每个用户构造一次,除非这是所期望的效果。