用WCF技術也有一段時間了,只知道引用服務地址后調用里面的方法就行了。之前也沒有思考wcf里面的一些東西,現在才對WCF里的一些產生疑惑,比如,為什么會有代理類,為什么要有綁定,信道又是干啥用的。
今天結合傳統的瀏覽器請求講講我個人的見解,至於WCF的基本技術點,什么信道,ChannelFactory,ClientBase之類的我就不管了。
由於技術有限,不對的地方歡迎批評。
那我們就傳統瀏覽器的例子解釋WCF里的一些技術名詞(WCF服務以IIS為宿主環境)
信道
當們我在瀏覽器里輸入地址,按下回車鍵后,就能得到我們想要看到的內容。
其實當我們按下回車的那一瞬間,瀏覽器幫我們做了很多工作,
如:與服務器建立連接,對發送的內容進行編碼,對數據進行傳輸等,這些步驟對應WCF里的信道,信道的作用正是通信的通道,
信道可不只有一個,最重要的有編碼信道,傳輸信道,正是這些信道解決兩個端點數據發送/接收和問題。
在普通瀏覽器請求中,信道是由瀏覽器建立出來的,而在WCF中,信息是被System.ServiceModel 這個組件建立的。所以我們使用WCF時必須要引用這個組件
地址
WCF的地址與瀏覽器的地址一樣,有了地址我們才知道我們要請求的服務在哪里。
綁定
如果我們用監聽軟件監聽HTTP請求,如Fiddler很容易發現請求的時候有這樣的信息:
這些信息在HTTP 請求里叫請求頭或者響應頭,它解決了客戶端和服務端用什么編碼規則,是什么數據類型,數據大小等規定。
在WCF里類似的這樣的規定叫“綁定”,
如:在反編譯器中給綁定對象賦值的CloseTimeOut,SendTimeOut是否很熟悉,webconfig里綁定配置里就有設置相關的內容。當然WCF的綁定比瀏覽器的功能更強大。
代理類
先說說序列化,客戶端和服務要傳遞的對象一定要是能序列化的,因為序列化后對象才能在網絡中傳輸,我們知道網絡傳輸最終的形式是比特流,而序列化正是把數據對象弄成比特流。
當們引用服務地址后(也可能用生成工具生成代理類),我們可以發現在Reference.cs里看到和服務端提供服務的類里的代碼非常像。這個文件是實實在在的存在我們本地文件夾里的,那這個文件就是我們VS,或者生成工具根據服務提供的元數據信息在我們本地生成的一個這樣的類。
那這個類的作用就是為我們本地代碼服務的,
首先里面的實體數據類,我可以new出實體對象與服務端進行數據傳遞,如參數對象等。
接着是操作類,就是后面帶有Client的類,當我們調用這個類里的方法的時候,信道就被創建出來了,信道出來后就能調用到服務端的方法了,也就完成了遠程調用了,得到了服務器返回給我們的結果。
既然WCF調用(IIS宿主環境),與瀏覽器請求本質是一樣的東西,為什么不能在瀏覽器里輸入服務地址得到處理結果呢。
因為WCF用的是SOAP協議,SOAP協議也是基於HTTP協議的,但是瀏覽器根本就不能處理SOAP的數據。
契約
聲明哪些函數和類可以讓客戶端使用
所以WCF最主要的功能可以看成兩點:封裝了一整套網絡通信的功能,本質上用的還是TCP/IP,Socket,Http那一套東西。二是數據的序列化以及反列化,配合SOAP就能在網絡或者遠程終端傳輸對象了。