前面的文章出現過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的適用場合:
- BasicHttpBinding:HTTP/HTTPS+XML方式傳輸,依循WS-Basic標準,適用ASMX這類舊式服務,安全性較差
- WSHttpBinding:HTTP/HTTPS,適合非雙工作業
- WSDual HttpBinding:HTTP/HTTPS,適合雙工作業,使用SOAP傳輸
- WS2007HttpBinding:HTTP/HTTPS,支援Session/ReliableSession/TransactionFlow
- WSFederationHttpBinidng:HTTP/HTTPS,支援WS-Federation,適用使用AD Federation的環境
- WS2007FederationHttpBinding:HTTP/HTTPS,WS2007HttpBinding支援WS-Federation
- NetTcpBinding:TCP,跨機器,網路可直通,講求高效率
- NetPeerTcpBinding:TCP,多機器間溝通
- NetNamedPipeBinding:Named Pipe,同機器不同程式間以WCF溝通
- NetMsmqBinding:MSMQ,跨機器且需要可靠的傳輸機制
- WebHttpBinding:HTTP/HTTPS,以HTTP Request取代SOAP Message
- 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。