文章編號: 917069 - 上次校閱: 2007年12月5日 - 版次: 3.3

如果要求逾時,應用程式會叫用的同處理序 COM + 元件時,ASP.NET 應用程式可能會遇到延遲

系統提示本文適用於您使用的作業系統之外的作業系統。與您不相關的文章內容已停用。

在此頁中

全部展開 | 全部摺疊

徵狀

考慮下列案例。Microsoft ASP.NET 應用程式叫用同處理序 Microsoft COM + 元件。要求逾時在精確的時間某些作業發生在 COM + 元件。在這種情況下 COM + 執行階段可能會向 Windows 錯誤報告子系統報告錯誤。 接著,Windows 錯誤報告可能採取的動作,可以在應用程式中導致額外的延遲和複合基礎問題。當您在 「 事件檢視器 」 中檢視系統記錄檔時,您可能會注意到類似下列的事件:

COM + 事件識別碼: 4768
事件類型: 錯誤
事件來源: COM +
事件類別目錄: 未知的事件
識別碼: 4786
說明: 「 系統已呼叫自訂元件,該元件已經失敗並且產生例外狀況。這表示與自訂元件的問題。通知一個失敗此元件的開發人員,並提供他們下列資訊。
方法名稱: IObjectControl::deactivate()
例外狀況: E0434F4D
地址: 0x77E649D3
呼叫堆疊:
kernel32! RaiseException + 0x48
mscorsvr! CoEEShutDownCOM + 0xe448
mscorsvr! CoEEShutDownCOM + 0xe3cb
mscorsvr! CoEEShutDownCOM + 0xe37f
mscorsvr! CoEEShutDownCOM + 0xe322
mscorsvr! GetMetaDataPublicInterfaceFromInternal + 0x26ef
mscorsvr! CoEEShutDownCOM + 0x15eae
mscorsvr! ReleaseFusionInterfaces + 0x1d2fa
comsvcs! RegisterComEvents + 0x3f074
comsvcs! RegisterComEvents + 0x40146
ole32! ReadStringStream + 0x22057
ole32! CreateDataAdviseHolder + 0x1534
ole32! CoQueryAuthenticationServices + 0xf5f
ole32! CoQueryAuthenticationServices + 0x1b06
ole32! CoQueryAuthenticationServices + 0x2236
事件類型: 錯誤
事件來源: 應用程式錯誤
事件類別: (100)
事件識別碼: 1000年
描述: 判定為失敗的應用程式 w3wp.exe 版本 6.0.3790.1830,模組 kernel32.dll 版本 5.2.3790.2756 錯誤地址 0x00015e02 判定為失敗。如需詳細資訊請 http://go.microsoft.com/fwlink/events.asp 在參閱 [說明及支援中心]。
資料: 0000: 41 70 70 6 c 69 63 61 74 Applicat 0008: 69 6f 6e 20 46 61 69 6 c 鋰失敗 0010: 75 72 65 20 20 77 33 77 ure w3w 0018: 70 2e 65 78 65 20 36 2e p.exe 6。0020: 30 2e 33 37 39 30 2e 31 0.3790.1 0028: 38 33 30 20 69 6e 20 6b 830 in k 0030: 65 72 6e 65 6 c 33 32 2e ernel32。0038: 64 6 c 6 c 20 35 2e 32 2e dll 5.2。0040: 33 37 39 30 2e 32 37 35 3790.275 0048: 36 20 61 74 20 6f 66 66 6 在關閉 0050: 73 65 74 20 30 30 30 31 組 0001 0058: 35 65 30 32 5e02

發生的原因

在超過針對 ASP.NET 要求逾時臨界值時,就會發生這個問題。 ASP.NET 執行階段會藉由擲回 ThreadAbortException 例外狀況,以處理要求的執行緒停止要求。 如果 ASP.NET 要求叫用的同處理序 COM + 元件,和如果其中一種 IObjectControl 方法元件的執行一次 ThreadAbortException 例外狀況的 COM + 執行階段將攔截的例外狀況,並回報給 Windows 錯誤報告的錯誤。然後,Windows 錯誤報告可能會建立事件記錄檔項目,並與錯誤報告的伺服器通訊。當就會發生這個問題在執行 ASP.NET 要求的執行緒會封鎖,並回應延遲。Windows 錯誤報告也可能會建立傾印檔案的程序。就會發生這個問題時凍結程序,並延遲的所有回應。裝載同處理序 (程式庫) COM + 應用程式的處理程序不會終止時,就會發生這些錯誤。此外,週期可能會在後續的逾時期間重複,並導致額外的延遲。

附註< 其他相關資訊 > 一節中的範例使用 Microsoft.NET Framework ServicedComponent 類別。不過,如果應用程式使用不受管理的 COM + 元件,就會發生相同的問題。

解決方案

若要解決這個問題,避免 ASP.NET 逾時。 如果 ASP.NET 要求都不應該超過逾時閾值,調查並解決基礎延遲的來源。 下列方法可以是有效的工具,來探索基礎延遲的來源:
  • 分析拍攝時遇到基礎的延遲的傾印檔案的程序。
  • 執行下一個程式碼剖析工具公用程式應用程式。
  • 請使用整個應用程式的記錄。
在某些案例中要求應該預期要花較長的時間比預設 ASP.NET 要求逾時。在這些案例中,您應該變更逾時值為更適當的值。 如果要執行此動作使用其中一個下列方法:
  • 使用 [executionTimeout] 設定。
  • 使用 Server.ScriptTimeout 屬性。

其他可行方案

如果要解決這個問題,您可以從同處理序 (程式庫) 應用程式逾時的處理 (伺服器) 應用程式來變更 COM + 應用程式。在伺服器應用程式中 COM + 元件在不同的處理序中執行從 ASP.NET 要求。因此,COM + 執行階段不會偵測一個 ThreadAbortException 例外狀況,例外狀況不報告給 Windows 錯誤報告子系統。

狀況說明

Microsoft 已確認<適用於>一節所列之 Microsoft 產品確實有此問題。

如果要重現問題的步驟

  1. 請依照 「 Microsoft 知識庫 」 文件來建立簡單的 ServicedComponent 類別,並再安裝到 COM + 的 [類別 306296。如需詳細資訊,請按一下下列的文件編號,檢視 「 Microsoft 知識庫 」 中的文件:
    306296? (http://support.microsoft.com/kb/306296/ ) 如何在 Visual C#.NET 中建立服務的.NET 元件
  2. 加入下列程式碼範例 ServicedComponent class.
    protected override void Activate()
    {
    	// Sleep for 100 seconds.
    	// (The default ASP.NET time-out is 90 seconds.)
    	System.Threading.Thread.Sleep(1000*100);
    }
    
  3. 建立 Web 應用程式在 Microsoft Visual C# 中。要這麼做,請您執行下列步驟:
    1. 啟動 Microsoft Visual Studio.NET。
    2. 在 [檔案] 功能表上指向 [新增],然後按一下 [專案]。
    3. 在 [新增專案] 對話方塊按一下 [專案類型,] 下的 [Visual C# 專案,然後再按一下 [範本] 下方的 [ASP.NET Web 應用程式
    4. 在 [位置] 方塊中,輸入 http://localhost/TestWeb1
    5. 按一下 [確定] 以建立專案。WebForm1.aspx 加入至您的專案。
  4. 在 [方案總管] 中 TestWeb1,] 上按一下滑鼠右鍵,然後按一下 [加入參考]。
  5. 在 [加入參考] 對話方塊中,按一下 [瀏覽]。
  6. 在 [選取元件] 對話方塊中,選取包含 ServicedComponent 之 DLL-衍生您在步驟 1 中產生的類別。
  7. 在 [方案總管] 的 WebForm1.aspx 上, 按一下滑鼠右鍵,然後按一下 [檢視程式碼
  8. 加入下列程式碼範例來 Page_Load 事件 procedure.
    // Create an instance of the ServicedComponent-derived class.
    // Note: Change the namespace and the class name as appropriate.
    MyNamespace.MyServicedComponent sc = new MyNamespace.MyServicedComponent();
    
    // Call any method on this object to cause the Activate method to occur.
    sc.DoTrans();
    
  9. 使用壓力測試公用程式來測試 http://localhost/TestWeb1/WebForm1.aspx 頁面。 比方說請遵循下列 「 Microsoft 知識庫 」 文件中所列的步驟:
    815161? (http://support.microsoft.com/kb/815161/ ) 如何使用 Web 應用程式壓力工具的量值 ASP.NET 回應速度

這篇文章中的資訊適用於:
  • Microsoft COM+ 1.5
  • Microsoft ASP.NET 1.0
  • Microsoft ASP.NET 1.1
  • Microsoft ASP.NET 2.0
關鍵字:?
kbmt kbtshoot kbbug kbprb KB917069 KbMtzh
機器翻譯機器翻譯
重要:本文是以 Microsoft 機器翻譯軟體翻譯而成,而非使用人工翻譯而成。Microsoft 同時提供使用者人工翻譯及機器翻譯兩個版本的文章,讓使用者可以依其使用語言使用知識庫中的所有文章。但是,機器翻譯的文章可能不盡完美。這些文章中也可能出現拼字、語意或文法上的錯誤,就像外國人在使用本國語言時可能發生的錯誤。Microsoft 不為內容的翻譯錯誤或客戶對該內容的使用所產生的任何錯誤或損害負責。Microsoft也同時將不斷地就機器翻譯軟體進行更新。
按一下這裡查看此文章的英文版本:917069? (http://support.microsoft.com/kb/917069/en-us/ )
Microsoft及(或)其供應商不就任何在本伺服器上發表的文字資料及其相關圖表資訊的恰當性作任何承諾。所有文字資料及其相關圖表均以「現狀」供應,不負任何擔保責任。Microsoft及(或)其供應商謹此聲明,不負任何對與此資訊有關之擔保責任,包括關於適售性、適用於某一特定用途、權利或不侵權的明示或默示擔保責任。Microsoft及(或)其供應商無論如何不對因或與使用本伺服器上資訊或與資訊的實行有關而引起的契約、過失或其他侵權行為之訴訟中的特別的、間接的、衍生性的損害或任何因使用而喪失所導致的之損害、資料或利潤負任何責任。