FIX: 儲存在工作階段狀態的 STA 物件的參考可能會損毀如果它們呼叫從 Session_End 事件

文章翻譯 文章翻譯
文章編號: 827164 - 檢視此文章適用的產品。
注意事項
本文章的有 Microsoft.NET Framework 1.0] 版本請參閱 827163
本文已封存。本文係以「現狀」提供且不會再更新。
全部展開 | 全部摺疊

在此頁中

徵狀

如果您在工作階段狀態中儲存單一執行緒公寓 (STA) 物件的參考,且您將 AspCompat 屬性設定為 true,參考可能會損毀,或當您嘗試將物件從存取 Session_End 事件可能會消失不見。

附註通常,如果您執行應用程式在高負載下的,或當您執行應用程式時,使用壓力工具等應用程式中心測試 (ACT),可能就會發生這個問題。 當就會發生這個問題會收到一個"0x8004e005 錯誤 」 事件記錄檔中的錯誤訊息。

發生的原因

Session_End 事件就不需要在相同工作階段已在建立的執行緒上執行,就會發生此問題。因為 STA 物件已經不在相同工作階段已在建立的執行緒上,封送處理,才能存取物件。這種行為會導致效能變慢。

您可以在工作階段狀態中儲存 STA 物件。不過,Microsoft 不建議您這麼。如需詳細資訊請參閱本文的 〈 參考 〉 一節]。

解決方案

此 Hotfix 會將新的組態設定加入 Machine.config 檔。下列應用程式組態位於安裝 Hotfix 之後,
<httpRuntime apartmentThreading=”true|false” />,
預設情況下,apartmentThreading 設為 false。如果您將 apartmentThreading 設定為 true 時,會發生下列行為:
  • 所有 Session_Start 事件會在對應的 STA 執行緒上都執行而不考慮的目標網頁或處理常式的工作階段 ID。
  • 所有 Session_End 事件會在對應的 STA 執行緒上都執行工作階段識別碼。
  • AspCompat 變成設為 為 True,則 所有的網頁以外的頁面,有 AspCompat 明確設定為 false
附註如果 apartmentThreading 設為 falseAspCompat 設定為 true 目標網頁,套用此 Hotfix 之後,可以仍然在 STA 執行緒上執行 Session_Start 事件。

此 Hotfix 適用於直接在工作階段狀態中儲存的 STA 物件。這個 Hotfix 也可為 STA 物件,是巢狀一個層級的深度,例如.NET 物件,會儲存在工作階段狀態,並可具有 STA 物件的參考。但是,此 Hotfix 無法運作的 STA 物件,會儲存一個以上的層級深度。

重要此 Hotfix 包含兩種類型的套件: Microsoft Windows 安裝程式封裝和一個選用元件管理員 」 套件 (OCM)。如果您使用 Microsoft Windows Server 2003 時,您必須指定您需要 Windows Server 2003 (OCM)] 更新因為 Windows Server 2003 檔案保護監視.NET Framework 1.1 檔案。如果您使用 Windows Server 2003 以外的作業系統時,您必須繼續使用 Windows 安裝程式封裝。

此 Hotfix OCM 版本是用於下列語言:
  • 英文 (ENU)
  • 日文 (日文)
  • 德文 (DEU)
  • 法文 (FRN)
支援的 Hotfix 現在可以從 Microsoft,但它只用來修正本文所述的問題。僅適用於發生此特定問題的系統。此 Hotfix 可能會接受其他測試。因此,如果您不會嚴重影響這個問題,我們建議您等候下一個的 Microsoft.NET Framework 1.1 Service Pack 包含此 Hotfix。

如果要立即解決這個問題,洽詢 Microsoft 技術支援部以取得該 Hotfix。如需 Microsoft 產品支援服務電話號碼及支援成本的相關資訊的完整清單,請造訪下列 Microsoft 網站]:
http://support.microsoft.com/contactus/?ws=support
附註 在特殊情況下通常會因支援電話所產生的費用可能就不收取如果 Microsoft 支援人員認為某特定更新程式可以解決您的問題。平常的支援成本將會套用到其他支援問題是所做不限定特定有問題的更新程式。

此 Hotfix 的英文版具有檔案屬性 (或更新) 中如下表所列。這些檔案的日期和時間為 Coordinated Universal Time (UTC)。當您檢視檔案資訊時,會將它轉換為當地時間。若要到 UTC 與當地時間差異使用 [中日期] 和 [時間] 工具,在 [控制台] 中的 [時區] 索引標籤]。
   Date         Time   Version       Size       File name
   ------------------------------------------------------------------------
   18-Sep-2003  05:18  1.1.4322.947    258,048  Aspnet_isapi.dll
   18-Sep-2003  05:18  1.1.4322.947     20,480  Aspnet_regiis.exe
   18-Sep-2003  05:18  1.1.4322.947     32,768  Aspnet_state.exe
   18-Sep-2003  05:18  1.1.4322.947     32,768  Aspnet_wp.exe
   16-May-2003  01:49                   33,522  Installpersistsqlstate.sql
   16-May-2003  01:49                   34,150  Installsqlstate.sql
   18-Sep-2003  05:09  1.1.4322.947     94,208  Perfcounter.dll
   19-Sep-2003  02:43  1.1.4322.947  1,216,512  System.dll
   19-Sep-2003  02:40  1.1.4322.947    323,584  System.runtime.remoting.dll
   19-Sep-2003  02:43  1.1.4322.947  1,253,376  System.web.dll
   19-Sep-2003  02:42  1.1.4322.947    819,200  System.web.mobile.dll
   19-Sep-2003  02:41  1.1.4322.947    569,344  System.web.services.dll
   19-Sep-2003  02:44  1.1.4322.947  1,335,296  System.xml.dll
   18-Sep-2003  05:13                   14,472  Webuivalidation.js

狀況說明

Microsoft 已確認這是本文 < 適用於 > 一節中所列的 Microsoft 產品中的問題。

其他相關資訊

此 Hotfix 套件也包含次要的 Hotfix。 如果為 true,設定 AspCompat,集合會儲存在工作階段狀態為 null 的 STA 物件,您可能會收到一個 NullReferenceException 」 錯誤訊息,當您重新載入頁面時。若要重現次要問題,內下列程式碼貼
	Session["obj"] = new Object();

	Session["obj"] = null;
當您第一次造訪這個頁面時,程式碼會正確地執行。 一個 Page_Load 事件。不過,如果您重新載入頁面時,從 Microsoft ASP.NET 接收 NullReferenceException 」 錯誤訊息,並您無法一次在目前的工作階段中檢視頁面。

堆疊追蹤:
[NullReferenceException: Object reference not set to an instance of an object.]
System.Web.UnsafeNativeMethods.AspCompatOnPageStart(Object obj) +0
System.Web.Util.AspCompatApplicationStep.OnPageStartSessionObjects() +90
System.Web.UI.Page.ProcessRequestMain() +44
若設定為 falseAspCompat,並不會發生此行為。

重製行為的步驟

如果要重現問題出現在本文 < 徵狀 > 一節中,請依照下列步驟執行:
  1. 使用 Microsoft Visual Basic.NET 來建立一個 Visual Basic ActiveX DLL 的物件。

    附註如果您將元件標記為 自主式執行 (UE) 時,仍然會發生此錯誤。
  2. DLL 類別中建立兩個函數:
    1. 建立函式,傳回的字串。
    2. 建立使用長參數的函式,然後,傳回長的值。這個函式並新增頁碼從 1 數傳遞至函式的迴圈。
  3. 建立新的 Web 應用程式 專案,有兩個.aspx 頁面 (Page1.aspx 和 Page2.aspx)。
  4. Session_Start 事件的 Global.asax 檔,使用 CreateObject 建立您在步驟 1 中建立的物件的執行個體。
  5. 在的 Page1.aspx 的該 Page_Load] 事件呼叫其中一個您在步驟 2 從儲存在工作階段狀態物件中建立的函式。
  6. 建立一個超連結到 Page2.aspx Page1.aspx 中。
  7. 在的 Page2.aspx 的該 Page_Load] 事件呼叫 Session.Abandon 方法。
  8. 使用應用程式中心測試 (ACT) 來建立記錄的檢視 Page1.aspx 與再檢視 Page2.aspx 作業的測試。
  9. 執行測試與十個使用者。如果錯誤 0x8004e005 出現在事件檢視器,請參閱。

    附註您可能必須增加著讓問題重現的使用者數目。

?考

如需詳細資訊按一下 [下列面的文件編號,檢視 「 Microsoft 知識庫 」 中發行項]:
243543資訊: 請不要在工作階段或應用程式中儲存 STA 物件
243815PRB: 儲存 STA COM 元件工作階段中的鎖定到單一執行緒的工作階段
817005FIX: 嚴重的效能問題,當您將工作階段狀態繫結至 ASPCompat 模式中的執行緒

屬性

文章編號: 827164 - 上次校閱: 2014年2月27日 - 版次: 1.7
這篇文章中的資訊適用於:
  • Microsoft .NET Framework 1.1
  • Microsoft Visual Studio .NET 2003 Enterprise Architect
  • Microsoft Visual Studio .NET 2003 Enterprise Developer
  • Microsoft Visual Studio .NET 2003 Academic Edition
  • Microsoft ASP.NET 1.1
關鍵字:?
kbnosurvey kbarchive kbmt kbhotfixserver kbqfe kberrmsg kbnetframe100presp3fix kbfix kbqfe kbcode kbbug KB827164 KbMtzh
機器翻譯
重要:本文是以 Microsoft 機器翻譯軟體翻譯而成,而非使用人工翻譯而成。Microsoft 同時提供使用者人工翻譯及機器翻譯兩個版本的文章,讓使用者可以依其使用語言使用知識庫中的所有文章。但是,機器翻譯的文章可能不盡完美。這些文章中也可能出現拼字、語意或文法上的錯誤,就像外國人在使用本國語言時可能發生的錯誤。Microsoft 不為內容的翻譯錯誤或客戶對該內容的使用所產生的任何錯誤或損害負責。Microsoft也同時將不斷地就機器翻譯軟體進行更新。
按一下這裡查看此文章的英文版本:827164
Microsoft及(或)其供應商不就任何在本伺服器上發表的文字資料及其相關圖表資訊的恰當性作任何承諾。所有文字資料及其相關圖表均以「現狀」供應,不負任何擔保責任。Microsoft及(或)其供應商謹此聲明,不負任何對與此資訊有關之擔保責任,包括關於適售性、適用於某一特定用途、權利或不侵權的明示或默示擔保責任。Microsoft及(或)其供應商無論如何不對因或與使用本伺服器上資訊或與資訊的實行有關而引起的契約、過失或其他侵權行為之訴訟中的特別的、間接的、衍生性的損害或任何因使用而喪失所導致的之損害、資料或利潤負任何責任。

提供意見

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com