【问题标题】:ASP.NET session and storing objects that use COM interopASP.NET 会话和存储使用 COM 互操作的对象
【发布时间】:2010-09-16 03:18:12
【问题描述】:

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

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

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

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

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

【问题讨论】:

    标签: asp.net com session interop


    【解决方案1】:

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

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

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

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 它包含用户特定的信息。因此不能跨会话共享。应该更清楚地说明这一点。
      猜你喜欢
      • 2011-11-18
      • 1970-01-01
      • 2012-04-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-03
      • 1970-01-01
      • 2012-12-13
      • 2011-05-29
      相关资源
      最近更新 更多