前面的文章出現過BasicHttpBinding、NetTcpBinding,又提到「BasicHttpBinding接受匿名存取,NetTcpBinding需要認證」的預設行為,後續還會看到一堆BlahBlahBinding,這裡花點時間做個簡單介紹。

BasicHttpBinding、NetTcpBinding這些都是WCF內建預設定義好的服務設定組合,裡面已定義好通訊協定、安全等級、Session支援、Transaction、雙工(Duplex)支援等特性,當然,不足時WCF也允許開發者自己定義特殊組合,做成自訂Binding。下表是完整的WCF預設Binding清單及其支援狀況。

表格資料來源:Configuring System-Provided Bindings

表格中各欄位的意義如下:

  • Interoperability Type:該Binding所支援的公開協定或技術
  • Security:共有五種,欄位列出的是可支援的項目,括號括起來的是預設選項
    • None 不加密也不認證
    • Transport 在傳輸層實現安全要求(例如:SSL、建立連線時的身分認證) ,認證種類有None/Basic/Windows/NTLM/Digest/Certificate等選擇,跟IIS的身分管控類似
    • Message 在訊息層實現安全要求,在訊息內加入身分認證、簽章資訊,也可對訊息加密。訊息層可用的認證種類有None/Windows/Username/Certificate/Issue Token。
    • Mixed 又稱為TransportWithCredentials,雙管齊下,在訊息層處理身分認證、在傳輸層處理加密及防止竄改
    • Both 訊息層跟傳輸層都加入安全機制,只有MSMQ辦得到
  • Session:是否支援Session
  • Transaction:是否啟用交易模式
  • Duplex:是否允許雙工(Server端呼叫Client端的方法),要做到雙工必須支援Session

由上表可知,之前測試跨機器使用NetTcpBinding得修改Security Mode是因為它的預設值為Transport,在傳輸層啟用了身分認證。

最後,簡單歸納各Binding的適用場合:

  1. BasicHttpBinding:HTTP/HTTPS+XML方式傳輸,依循WS-Basic標準,適用ASMX這類舊式服務,安全性較差
  2. WSHttpBinding:HTTP/HTTPS,適合非雙工作業
  3. WSDual HttpBinding:HTTP/HTTPS,適合雙工作業,使用SOAP傳輸
  4. WS2007HttpBinding:HTTP/HTTPS,支援Session/ReliableSession/TransactionFlow
  5. WSFederationHttpBinidng:HTTP/HTTPS,支援WS-Federation,適用使用AD Federation的環境
  6. WS2007FederationHttpBinding:HTTP/HTTPS,WS2007HttpBinding支援WS-Federation
  7. NetTcpBinding:TCP,跨機器,網路可直通,講求高效率
  8. NetPeerTcpBinding:TCP,多機器間溝通
  9. NetNamedPipeBinding:Named Pipe,同機器不同程式間以WCF溝通
  10. NetMsmqBinding:MSMQ,跨機器且需要可靠的傳輸機制
  11. WebHttpBinding:HTTP/HTTPS,以HTTP Request取代SOAP Message
  12. MsmqIntegrationBinding:WCF與MSMQ現有程式溝通

BasicHttpBinding的通透性最高,可以像ASMX一樣跨平台提供服務,Net*Binding則限定Client/Server都是Windows才能運作。至於Ws*Binding,背後依循了公開的MTOM、WS-Security等規範,其他平台廠商或平台只要支援該規範,就可整合應用實現SOA跨平台整合的夢想。只是,技術趨勢三不五時就轉風向,上回聽到SOA這名詞彷彿已是唐朝的事,至今是否還有人玩是個好問題,呵~ 這一系列我只想乖乖研究WCF在Windows平台的應用,跨平台還是交給Web API吧!

結論:要向前相容就用BasicHttpBinding/WSHttpBinding,要雙工只能選WSDualHttpBinding、NetTcpBinding、NetNamedPipeBinding;若WCF Server及Client都是Windows,Client/Server都在同一台機器又不想對外開放可選NetNamedPipeBinding,跨機器就用NetTcpBinding。如果有Reuqest/Reponse傳送過程不容許任何差錯,則可考慮NetMsmqBinding。


Comments

# by keith

What is Duplex? What difference can it make?

# by Jeffrey

to keith, 關於Duplex(雙工)之後會有做詳細的介紹。

Post a comment