文章出處

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

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

 

 


文章列表




Avast logo

Avast 防毒軟體已檢查此封電子郵件的病毒。
www.avast.com


arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()