十五天精通WCF——第三天 client如何知道server提供的功能清單

一線碼農發表於2015-06-10

    通常我們去大保健的時候,都會找姑娘問一下這裡能提供什麼服務,什麼價格,這時候可能姑娘會跟你口述一些服務或者提供一份服務清單,這樣的話大

家就可以做到童嫂無欺,這樣一份活生生的例子,在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,服務地址等等。。。然後就沒什麼好說的了。

 

 

相關文章