本主題討論讓撰寫 WCF 應用程式更簡單的新功能。
gRPC 作為 WCF 的替代方案
gRPC 是新式 RPC 架構,是 WCF 的熱門替代方案。 gRPC 建置在 HTTP/2 之上,可提供一些優於 WCF 的優點,包括:
- 效能:gRPC 比 WCF 更有效率,尤其是針對長時間執行的連線。
- 延展性:gRPC 的設計目的是要擴充到大量的客戶端和伺服器。
- 安全性:gRPC 支援各種安全性機制,包括 TLS 和驗證。
- 跨平臺:gRPC 是平臺中立的,可與各種程序設計語言搭配使用。
如需開發或移轉 WCF 應用程式至 gRPC 的詳細資訊,請參閱:
簡化版的組態檔
當您在 Visual Studio 中新增服務參考或使用 SvcUtil.exe 工具時,會產生用戶端組態檔。 在舊版 WCF 中,這些組態檔包含每個系結屬性的值,即使其值為預設值也一樣。 在 WCF 4.5 中,產生的組態檔只包含設定為非預設值的系結屬性。
以下是 WCF 3.0 所產生的組態檔範例。
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<system.serviceModel>
<bindings>
<basicHttpBinding>
<binding name="BasicHttpBinding_IService1" closeTimeout="00:01:00"
openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
allowCookies="false" bypassProxyOnLocal="false"
hostNameComparisonMode="StrongWildcard" maxBufferSize="65536"
maxBufferPoolSize="524288" maxReceivedMessageSize="65536"
messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered"
useDefaultWebProxy="true">
<readerQuotas maxDepth="32" maxStringContentLength="8192"
maxArrayLength="16384" maxBytesPerRead="4096"
maxNameTableCharCount="16384" />
<security mode="None">
<transport clientCredentialType="None" proxyCredentialType="None"
realm="" />
<message clientCredentialType="UserName" algorithmSuite="Default" />
</security>
</binding>
</basicHttpBinding>
</bindings>
<client>
<endpoint address="http://localhost:36906/Service1.svc" binding="basicHttpBinding"
bindingConfiguration="BasicHttpBinding_IService1" contract="IService1"
name="BasicHttpBinding_IService1" />
</client>
</system.serviceModel>
</configuration>
以下是 WCF 4.5 所產生的相同組態檔範例。
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<system.serviceModel>
<bindings>
<basicHttpBinding>
<binding name="BasicHttpBinding_IService1" />
</basicHttpBinding>
</bindings>
<client>
<endpoint address="http://localhost:36906/Service1.svc" binding="basicHttpBinding"
bindingConfiguration="BasicHttpBinding_IService1" contract="IService1"
name="BasicHttpBinding_IService1" />
</client>
</system.serviceModel>
</configuration>
Contract-First 開發
WCF 現在支援合約優先開發。 svcutil.exe 工具具有 /serviceContract 參數,可讓您從 WSDL 檔產生服務和數據合約。
從可攜式子集專案新增服務參考
可攜式子集專案可讓 .NET 元件程式設計人員維護單一來源樹狀結構並建置系統,同時仍支援多個 .NET 實作(桌面、Silverlight、Windows Phone 和 Xbox)。 可攜式子集專案只會參考 .NET 可攜式連結庫,這些連結庫是可用於任何 .NET 實作的元件。 開發人員體驗與在任何其他 WCF 用戶端應用程式中新增服務參考相同。 如需詳細資訊,請參閱 在可攜式子集專案中新增服務參考。
ASP.NET 相容性模式預設值已變更
WCF 提供 ASP.NET 相容性模式,在撰寫 WCF 服務時,授與開發人員 ASP.NET HTTP 管線中功能的完整存取權。 若要使用此模式,您必須在 web.config的 aspNetCompatibilityEnabled
區段中,將 屬性設定<為 true。此外,此 appDomain 中的任何服務都必須在其 > 上將 屬性設定為 RequirementsMode
或 AspNetCompatibilityRequirementsAttribute。
AspNetCompatibilityRequirementsAttribute預設會設定為 Allowed ,而預設 WCF 服務應用程式範本會將 aspNetCompatibilityEnabled
屬性設定為 true
。 如需詳細資訊,請參閱 Windows Communication Foundation 4.5 和 WCF 服務和 ASP.NET 的新功能。
串流改善
已將異步串流的新支援新增至 WCF。 如果要啟用非同步資料流,請將DispatcherSynchronizationBehavior 端點行為加入至服務主機,並將其AsynchronousSendEnabled屬性設定為
true
。 當服務將串流訊息傳送至讀取速度緩慢的多個用戶端時,這可能會讓延展性受益。 WCF 不會再封鎖每個用戶端一個線程,而且會將線程釋出給另一個用戶端。移除了在 IIS 伺服器裝載的服務中與訊息緩衝相關的限制。 在舊版 WCF 中,收到使用串流訊息傳輸之 IIS 裝載服務的訊息時,ASP.NET 會先緩衝處理整個訊息,再將它傳送至 WCF。 這會導致大量的記憶體耗用量。 此緩衝已在 .NET Framework 4.5 中移除,現在 IIS 裝載的 WCF 服務可以在收到整個訊息之前開始處理傳入數據流,藉此啟用真正的串流。 這可讓 WCF 立即回應訊息,並允許改善效能。 此外,您不再需要為 ASP.NET 傳入要求的大小限制
maxRequestLength
指定值。 如果已設定這個屬性,則會忽略它。 如需詳細資訊,maxRequestLength
請參閱 <HTTPRuntime> 組態專案。 您仍然需要設定 maxAllowedContentLength,如需詳細資訊,請參閱 IIS 要求限制。
新的傳輸預設值
下表描述已變更的設定,以及尋找其他資訊的位置。
房產 | 上 | 新增預設值 | 詳細資訊 |
---|---|---|---|
通道初始化超時 | NetTcpBinding | 30 秒 | 這個屬性會決定 TCP 連線可以使用 .NET 框架通訊協議來驗證自己所需的時間。 客戶端必須先傳送一些初始數據,伺服器才能有足夠的資訊來執行驗證。 此逾時設置得比 ReceiveTimeout(10 分鐘)更短,以防止惡意且未經驗證的用戶端長時間佔用伺服器的連線。 預設值為 30 秒。 如需詳細資訊 ChannelInitializationTimeout |
監聽積壓 | NetTcpBinding | 16 * 處理器數目 | 這個套接字層級屬性描述待處理的接受請求之數目,這些請求將被排入佇列。 如果接聽待辦專案佇列填滿,將會拒絕新的套接字要求。 如需詳細資訊 ListenBacklog |
maxPendingAccepts (最大待處理接受數) | ConnectionOrientedTransportBindingElement SMSvcHost.exe |
2 * 用於傳輸的處理器數目 4 * SMSvcHost.exe 處理器數目 |
此屬性會限制伺服器在監聽器上可以等候的通道數目。 當 MaxPendingAccepts 太低時,將會有一小段時間,讓所有等候的通道都已開始維護連線,但沒有新的通道開始接聽。 連線可以在此間隔期間抵達,而且會失敗,因為伺服器上沒有任何專案正在等候。 這個屬性可以藉由將 MaxPendingConnections 屬性設定為較大的數位來設定。 如需詳細資訊,請參閱 MaxPendingAccepts 和 設定 Net.TCP 埠共用服務 |
最大待處理連線數 | ConnectionOrientedTransportBindingElement | 12 * 處理器數目 | 此屬性可控制傳輸已接受但尚未由 ServiceModel Dispatcher 挑選的連線數目。 若要設定此值,請在繫結或繫結元素上使用 MaxConnections 或 maxOutboundConnectionsPerEndpoint 。 如需詳細資訊 MaxPendingConnections |
receiveTimeout | SMSvcHost.exe | 30 秒 | 這個屬性會指定讀取 TCP 框架數據的逾時,以及從基礎連線執行連線分派。 該機制的建立是為了限制 SMSvcHost.exe 服務從傳入連線中讀取前置數據的執行時間。 如需詳細資訊,請參閱 設定 Net.TCP 埠共用服務。 |
備註
只有在您使用 .NET Framework 4.5 的計算機上部署 WCF 服務時,才會使用這些新的預設值。 如果您在使用 .NET Framework 4.0 的計算機上部署相同的服務,則會使用 .NET Framework 4.0 預設值。 在這種情況下,建議明確設定這些設定。
XmlDictionaryReaderQuotas
XmlDictionaryReaderQuotas 包含 XML 字典讀取器的可設定配額值,可限制編碼器在建立訊息時所使用的記憶體數量。 雖然這些配額可設定,但預設值已變更為降低開發人員必須明確設定這些配額的可能性。
MaxReceivedMessageSize
配額尚未變更,因此仍可限制記憶體耗用量,避免您需要處理 XmlDictionaryReaderQuotas 的複雜性。 下表顯示配額、其新預設值,以及每個配額用途的簡短說明。
配額名稱 | 預設值 | 說明 |
---|---|---|
MaxArrayLength | Int32.MaxValue | 取得和設定允許的陣列長度上限。 此配額會限制 XML 讀取器傳回的原始類型陣列的大小上限,包括位元組陣列。 此配額不會限制 XML 讀取器本身的記憶體耗用量,而是在使用讀取器的任何元件中。 例如,當使用DataContractSerializer保護的MaxArrayLength讀取器時,它不會反序列化大於此配額的位元組陣列。 |
MaxBytesPerRead | Int32.MaxValue | 取得並設定每次讀取可傳回的最大允許位元數。 此配額會限制讀取元素開始標記及其屬性時,在單一讀取作業中讀取的位元組數目。 (在未串流的情況下,項目名稱本身不會計入配額。 由於必須檢查屬性名稱是否有唯一性,因此擁有太多 XML 屬性可能會佔用不成比例的處理時間。 MaxBytesPerRead 降低此威脅。 |
MaxDepth | 深度達 128 個節點 | 此配額會限制 XML 元素的巢狀深度上限。 MaxDepth與MaxBytesPerRead互動:閱讀器總是會將目前元素及其所有祖先的數據保留在記憶體中,因此閱讀器的最大記憶體消耗量會與這些設置的乘積成正比。 反序列化深層巢狀物件圖形時,反序列化工具會被迫存取整個堆疊,並擲回無法恢復的 StackOverflowException。 DataContractSerializer 和 XmlSerializer 的 XML 巢狀結構與物件巢狀結構之間存在直接的關聯。 MaxDepth 是用來減輕此威脅。 |
MaxNameTableCharCount | Int32.MaxValue | 此配額會限制 nametable 中允許的字元數上限。 nametable 包含處理 XML 檔時遇到的特定字串(例如命名空間和前置詞)。 當這些字串在記憶體中緩衝時,此配額用於防止在預期串流的情況下出現過度緩衝。 |
MaxStringContentLength | Int32.MaxValue | 此配額會限制 XML 讀取器傳回的最大字串大小。 此配額不會限制 XML 讀取器本身的記憶體耗用量,而是在使用讀取器的元件中。 例如,當 DataContractSerializer 使用以 MaxStringContentLength 保護的讀取器時,它不會反序列化大於此配額的字串。 |
這很重要
如需保護數據的詳細資訊,請參閱
備註
只有在您使用 .NET Framework 4.5 的計算機上部署 WCF 服務時,才會使用這些新的預設值。 如果您在使用 .NET Framework 4.0 的計算機上部署相同的服務,則會使用 .NET Framework 4.0 預設值。 在這種情況下,建議明確設定這些設定。
WCF 組態驗證
作為 Visual Studio 內建置程式的一部分,現在會驗證 WCF 組態檔。 如果驗證失敗,驗證錯誤或警告的清單會顯示在 Visual Studio 中。
XML 編輯器工具提示
為了協助新的和現有的 WCF 服務開發人員設定其服務,Visual Studio XML 編輯器現在會為每個組態專案及其屬於服務組態檔一部分的屬性提供工具提示。
BasicHttpBinding 改進提升
可讓單一 WCF 端點回應不同的驗證模式。
讓 WCF 服務的安全性設定可由 IIS 控制