WCF 中,最複雜的,我認為應該是 Binding 了。
要選擇適當的 binding, 通常要了解一堆的 WS-* 的標準,配合客戶需求,剔除不必要的選項後,才是我們適合的 binding.
那什麼是 Binding 呢?
Binding 定義了客戶端與伺服器端的「溝通方式」,主要有下列三大類(但不限)
- Transport Protocol: Http, Tcp, Msmq, etc
- Message format: Xml, Mtom, Json, binary, etc
- Message protocols: Soap, WS-*, none, etc
WCF 內建提供的 Binding, 目前已達12 種了。如果都不適用,還可以自訂 CustomBinding。
那要如何選擇呢?有沒一個建議的流程呢?在 patterns & practices Improving Web Services Security Guide 中有簡略描述。以下就嘗試翻譯並整理一下!
<basicHttpBinding>
<binding
allowCookies="Boolean"
bypassProxyOnLocal="Boolean"
closeTimeout="TimeSpan"
envelopeVersion="None/Soap11/Soap12"
hostNameComparisonMode="StrongWildCard/Exact/WeakWildcard"
maxBufferPoolSize="Integer"
maxBufferSize="Integer"
maxReceivedMessageSize="Integer"
messageEncoding="Text/Mtom"
name="string"
openTimeout="TimeSpan"
proxyAddress="URI"
receiveTimeout="TimeSpan"
sendTimeout="TimeSpan"
textEncoding="UnicodeFffeTextEncoding/Utf16TextEncoding/Utf8TextEncoding"
transferMode="Buffered/Streamed/StreamedRequest/StreamedResponse"
useDefaultWebProxy="Boolean"
<security mode="None/Transport/Message/TransportWithMessageCredential/TransportCredentialOnly">
<transport clientCredentialType="None/Basic/Digest/Ntlm/Windows/Certificate"
proxyCredentialType="None/Basic/Digest/Ntlm/Windows"
realm="string" />
<message
algorithmSuite="Basic128/Basic192/Basic256/Basic128Rsa15/Basic256Rsa15/TripleDes/TripleDesRsa15/Basic128Sha256/Basic192Sha256/TripleDesSha256/Basic128Sha256Rsa15/Basic192Sha256Rsa15/Basic256Sha256Rsa15/TripleDesSha256Rsa15"
clientCredentialType="UserName/Certificate"/>
</security>
<readerQuotas maxDepth="Integer"
maxStringContentLength="Integer"
maxByteArrayContentLength="Integer"
maxBytesPerRead="Integer"
maxNameTableCharCount="Integer" />
</binding>
</basicHttpBinding>
basicHttpBinding
- 與 ASMX web service 相容,即WS-I Basic Profile 1.1
- 預設沒有實作安全相關標準。如果需要安全,則需要設定 Security.Mode。
- 在沒有安全性的要求下,(即 <scurity mode=’none’> 或 Security.Mode 設為 BasicHttpSecurityMode.None),basicHttpBinging使用了 TextMessageEncodingBindingElement 與 HttpTransportBindingElement 這兩個 binding element。TextMessageEncodingBindingElement 將訊息格式化為與 SOAP 相容。HttpTransportBindingElement 則將訊息以 http protocol 傳送。因此,在basicHttpBinding 中,可以看到TextMessageEncodingBindingElement 與 HttpTransportBindingElement 相關的 configuration schema.
- 若要使用 SSL, 即要以 HTTPS 來傳送訊息,則需設定<scurity mode=’Transport’>,此時 HttpTransportBindingElement會被 HttpsTransportBindingElement 所取代。事實上HttpsTransportBindingElement 繼承HttpTransportBindingElement,所以只有多了一些功能。
- BasicHttpBinding 可以使用於 IIS5 或 IIS6 上
- messageEncoding=”Mtom” 時,會將 TextMessageEncodingBindingElement 以 MtomMessageEncodingBindingElement 取代。MTOM 編碼方式 實作了 W3C SOAP Message Transmission Optimization Mechanism, 用於以SOAP格式傳輸 binary 資料如附件、圖片,以降低訊息的大小。
沒有留言:
張貼留言