通常我們去大保健的時候,都會找姑娘問一下這裡能提供什麼服務,什麼價格,這時候可能姑娘會跟你口述一些服務或者提供一份服務清單,這樣的話大
家就可以做到童嫂無欺,這樣一份活生生的例子,在wcf中同樣是一個道理,只有client瞭解service能提供哪些功能,client才可以根據server提供的功能進行
消費,那問題來了,service怎麼把功能提供給client進行選擇呢???這個就是我這一篇要聊的wsdl(web service description language)。。。
一:wsdl
現在你已經知道了,wsdl就是server提供給client的清單,那下面問題就來了。server是如何提供的呢???你要是比較仔細的話,可能會知道我在上一
篇提到的一個endpoint,如下截圖。
在上面這幅圖中,你可以看到,Homeservice提供了兩個端點,一個是“服務端點“,一個是“後設資料端點”。並且你也看到了,後設資料的端點地址是
http://192.168.16.16:19200/mex,當client通過svcutil訪問這個地址的時候,就拿到了server能提供的功能清單,然後client就可以根據這些功能生成一
個代理檔案,然後的然後,就是你懂得,各種啪啪啪,XXXClient。
二:眼見為實
1.見證wsdl
要想看見wsdl,你只需要通過http://localhost:19200開啟服務地址、如下圖:
然後點選:http://localhost:19200/?singleWsdl
現在你看到的就是server功能清單,太tmd的重量級了,已經完完全全果體在世人前了,下一小節我們再詳細的分析下。
2. 見證client端的XXXclient
剛才我也說了,當你用vs做“服務引用”的時候,svcutil會根據http://localhost:19200/mex的地址來檢視wsdl,然後生成代理,下面我們具體來看一下。
點選確定之後,我們就可以看到在 Service References 資料夾下面生成了一個Reference.cs 檔案。
然後我們開啟Reference.cs,就可以看到一個繼承於ClientBase的HomeServiceClient。
三:詳細分析wsdl檔案
學wcf,你一定要像svcutil一樣能夠看得懂wsdl。
1. 首先看下server提供了一個Update操作,引數是一個id,一個Student這個自定義的複雜型別,同時返回也是Student這個
複雜型別。
1 namespace MyService 2 { 3 [ServiceContract] 4 public interface IHomeService 5 { 6 [OperationContract] 7 Student Update(int id, Student stu); 8 } 9 }
2. wsdl這個xml檔案,剛才你也看到了,下面我們一個個節點看看
<1> portType 和 operation節點
當你看到下面的截圖後,我想你也能猜的出來,portType就是契約(IHomeService),operation就是契約方法(Update),不過有點意思的是,在operation
下面你看到了一個input,一個output,這個就是所謂的 ”輸入訊息“,”輸出訊息”,那是什麼意思呢??? 也就是說client到server的訊息叫做“輸入訊息”,server到
client端叫做“輸出訊息”,到這裡你應該似乎明白了,我C#中的Update方法是有入參和出參的,然而這對映到wsdl中就是兩條訊息,input和output,這個也就是經典
的“請求-響應“模式。
好了,繼續往下看,在wsdl:input和wsdl:output中分別有一個Action屬性,這個非常有意思,wcf的底層就是通過這個地址來找到對應的方法,比如我們看到的代理
類中的Update方法上面就有這麼一段。
<2> message 和 types節點
繼續往下看的話,你會發現input和output中還有一個message屬性,對應的為IHomeService_Update_InputMessage和IHomeService_Update_OutputMessage,
這個正好是message節點的引用,如下圖:
從這個圖中,你可以看到input和output下面都有一個wsdl:part節點,這個就是表明input和output中需要攜帶的引數,比如element="tns:Update",就引用了
element中Name=Update的節點,如下圖:
好了,最後我再截一張圖,可以看到,傳輸協議為soap,服務地址等等。。。然後就沒什麼好說的了。