2008-10-08 83 views
0

我正在研究一個asp.net網站。我們必須使用com interop來與傳統的vb6 activex組件進行交互。在許多情況下,組件依賴於接收一個上下文對象(它本身就是一個vb6 activex組件)作爲參數。上下文對象構造起來相當昂貴。ASP.NET會話和存儲使用COM互操作的對象

因此,一個想法是上下文對象構造一次並存儲在asp.net會話中。但是,如果此對象只是一個圍繞activex組件的.net包裝器,那麼在會話中堅持這樣一個對象是明智的還是明智的?

此外,上下文對象包含用戶特定的信息,所以堅持使用.net HttpRuntime緩存可以使用,但需要用戶特定的密鑰。

我瞭解其他限制和你需要注意的事情與asp.net會議,aspnet-session question

問一個稍微不同的方式:他們是否存在一個.net對象的任何問題或問題,它只是一個COM對象的包裝?

回答

3

我想你會很快得到一個請求阻塞另一個請求的問題。

默認情況下,ASP.NET會在其線程上初始化COM以將線程置於多線程單元中。 VB6組件最好是公寓模型。這意味着當MTA線程創建組件時,如果已經存在(如果它已經存在,則不會),或者專門爲STA創建一個新線程,將其放入主STA中。無論哪個MTA線程創建組件都無關緊要,同一個STA始終用於無法處理MTA模型的組件。這意味着每個對這些組件的調用都使用同一個線程,所以併發調用必須排隊等待。

要告訴ASP.NET爲單線程組件初始化COM,它至少會使該對象與執行頁面在同一線程上創建,請將AspCompat屬性添加到@Page指令中。

我不會緩存這些對象,因爲它們在重用時很可能存在跨線程問題。

+0

感謝邁克,非常有用的信息。 – Jon 2008-10-09 01:54:32

0

我會將它保存在緩存中,這樣它不會爲每個用戶構建一次,除非這是所需的效果。

+0

它包含用戶特定的信息。因此不能在會話中共享。應該做得更清楚。 – Jon 2008-10-08 20:54:01