本主題描述 Windows Communication Foundation (WCF) 架構的不同區域的各種屬性,這些屬性可用來控制資源耗用量並影響效能計量。
限制 WCF 中資源耗用量的屬性
Windows Communication Foundation (WCF) 會針對安全性或效能用途,針對特定類型的進程套用條件約束。 這些條件約束有兩種主要形式,其中一種是配額和節流。 配額 是一項界限,當達到或超過時,會在系統中的某個時間點或情況下即時觸發例外狀況。 節流 是設定的限制,不會立即導致擲回例外狀況。 相反地,達到節流限制時,處理會繼續,但在該節流值所設定的限制內。 此有限的處理可能會在其他地方觸發例外狀況,但這取決於應用程式。
除了配額和節流之間的差異之外,有些限制屬性位於串行化層級、某些位於傳輸層級,有些則位於應用層級。 例如,所有系統提供的傳輸綁定項所實作的配額 TransportBindingElement.MaxReceivedMessageSize預設會設定為65,536個字節,藉由造成過多記憶體耗用量來妨礙惡意客戶端對服務進行阻斷服務攻擊。 (一般而言,您可以藉由降低此值來提升效能。
串行化配額的範例是 DataContractSerializer.MaxItemsInObjectGraph 屬性,它會指定串行化程式在單 ReadObject 一方法呼叫中串行化或還原串行化的物件數目上限。 應用層級節流範例是 ServiceThrottle.MaxConcurrentSessions 屬性,其預設會將並行會話通道連線數目限制為10。 (不同於配額,如果達到此節流值,應用程式會繼續處理,但不接受新的會話通道,這表示新客戶端在結束其他會話通道之前無法連線。
這些控件的設計目的是針對特定類型的攻擊提供現成防護功能,或改善效能計量,例如記憶體使用量、啟動時間等等。 不過,視應用程式而定,這些控件可能會妨礙服務應用程式效能,或防止應用程式完全運作。 例如,設計用來串流視訊的應用程式可以輕鬆地超過預設 TransportBindingElement.MaxReceivedMessageSize 屬性。 本主題提供各種套用至 WCF 層級應用程式之控件的概觀、描述各種方法,以取得設定是否阻礙應用程式的詳細資訊,並描述修正各種問題的方法。 大部分節流和某些配額都可在應用層級使用,即使基底屬性是串行化或傳輸條件約束。 例如,您可以使用 DataContractSerializer.MaxItemsInObjectGraph 屬性設置服務類別中的 ServiceBehaviorAttribute.MaxItemsInObjectGraph 屬性。
備註
如果您有特定問題,您應該先閱讀 WCF 疑難解答快速入門 ,以查看您的問題 (和解決方案) 是否列在那裡。
限制串行化進程的屬性會列在 數據的安全性考慮中。 限制傳輸相關資源耗用量的屬性會列在 傳輸配額中。 限制應用層資源耗用量的屬性是 類別的成員 ServiceThrottle 。
偵測與配額設定相關的應用程式和效能問題
已選擇上述值的預設值,以跨各種應用程式類型啟用基本應用程式功能,同時針對常見的安全性問題提供基本保護。 不過,不同的應用程式設計可能會超過一或多個節流設定,儘管如此,這些應用程式仍然是安全的,並且能如設計般運作。 在這些情況下,您必須識別哪些節流值被超過,以及在哪個層級,並決定適當的行動方案,以提高應用程式的輸送量。
一般而言,在撰寫應用程式並進行偵錯時,您會在組態檔中或以程式設計方式將 屬性設定 ServiceDebugBehavior.IncludeExceptionDetailInFaults 為 true 。 這會指示 WCF 將服務例外狀況堆疊追蹤傳回用戶端應用程式以供檢視。 此功能會報告大部分應用層級的例外狀況,例如,如果發生問題,則顯示可能涉及哪些配額設定。
部分例外在執行時發生於應用層可見範圍之外,因此不會透過此機制回傳。而自訂 System.ServiceModel.Dispatcher.IErrorHandler 實作可能無法處理這些例外。 如果您位於像是 Microsoft Visual Studio 的開發環境中,大部分例外狀況都會自動顯示。 不過,某些例外狀況可以透過開發環境設定來遮罩,例如 Just My Code Visual Studio。
不論開發環境的功能為何,您都可以使用 WCF 追蹤和訊息記錄的功能來偵錯所有例外狀況,並調整應用程式的效能。 如需詳細資訊,請參閱 使用追蹤排解應用程式的疑難。
效能問題和 XmlSerializer
使用可序列化資料型別的服務與用戶端應用程式,會在執行時產生 XmlSerializer 並編譯這些資料型別的序列化程式碼,這可能導致啟動效能緩慢。
備註
預先產生的串行化程式代碼只能在用戶端應用程式中使用,不能用於服務。
ServiceModel 元數據公用程式工具(Svcutil.exe)可以從應用程式的編譯元件產生必要的串行化程序代碼,以改善這些應用程式的啟動效能。 如需詳細資訊,請參閱 如何:使用 XmlSerializer 改善 WCF 用戶端應用程式的啟動時間。
在 ASP.NET 下裝載 WCF 服務的效能問題
當 WCF 服務裝載在 IIS 下併 ASP.NET 時,IIS 和 ASP.NET 的組態設定可能會影響 WCF 服務的輸送量和記憶體使用量。 如需 ASP.NET 效能的詳細資訊,請參閱 改善 ASP.NET 效能。 可能有非預期後果的其中一個設定是 MinWorkerThreads,這是 的 ProcessModelSection屬性。 如果您的應用程式有固定或少量的用戶端,則設定 MinWorkerThreads 為 2 可能會在 CPU 使用率接近 100%的多處理器電腦上提供輸送量提升。 這會增加效能的成本:這也會導致記憶體使用量增加,進而降低延展性。