在我們玩wcf的時候,都會潛意識的覺得wcf就是通過soap協定交換消息的,并且可以在basic,tcp,msmq等等綁定中任意切換,
牛逼的一塌糊塗,但是呢,如果說哪一天wcf不再使用soap協定,而是采用json格式的字元串,是不是有一點颠覆你對wcf的認識的???
從傳統意義上說,wcf是非常重量級的,很明白的一個例子就是太多太多的配置,尤其是Behavior的配置,而且behavior對wcf來說又是重
中之重,它對wcf的擴充和性能又是最重要的,可恨的是wcf在binding,behavior,contract之中的配置又是非常非常的保守,可以說用
wcf來玩分布式,這些預設配置是完全做不到的,就比如說basicbinding的基類HttpBindingBase。

抱怨的話我也不說了,可能微軟也覺得這個問題是個不小的問題,然後就有了輕量級的 asp.net web api,你可以看到它和wcf比起來精
簡多了,也許讓我們這些碼農更加的專注于業務吧,既然wcf帶了這玩意,我也得必須約談一下。
一:UriTemplate
要說rest,還得先說UriTemplate,因為wcf用UriTemplate來做rest中的uri模闆比對,然後用WebInvoke這個OperationBehavior
插入到wcf的心髒中,說的玄乎一點,這個就有點像mvc中的路由比對機制,下面我舉個例子:
1. 用UriTemplate來告知可以監視的完整Url
從下面的圖中,可以看到三個元素:服務位址,模闆,入參(這裡面的”1“),這三個元素組合在一起,就構成了完整的remote url,
然後這個完整的url就是我模闆(/User/{id})監視的對象。
2. 通過UriTemplate來解析url中的參數。
既然可以建構url,那當然可以解析url啦,對吧,下面這張圖可以很清晰的告知你,當外來的url=http://127.0.1:1920/HomeService
/User/1過來的時候應該被哪個uriTemplate所接收。
正是因為UriTemplate具有這樣的url建構和解析能力,是以wcf就把UriTemplate作為WebInvoke和WebGet這兩個屬性的參數來動态
解析外來的url,然後根據這個url配置設定到具體的服務方法上,下面我們具體看一看。
二:WebGet,WebInvoke的使用
剛才也說了,WebGet和WebInvoke正是用了UriTemplate,才具有了路由轉向的功能,還有就是預設傳回的是xml,這裡就用json
值作為服務傳回的格式
對了,Rest推薦使用Http協定中的Get,Post,Delete,Put來作為CURD的狀态機制,然後就是你如果看懂了UriTemplate,那你現在應
該知道這個Template在監視什麼類型的url。做完了上面的coding,下面我們需要在webconfig中通過behavior來指定啟動“web程式設計模型”,
就比如下面這樣。
其實呢?也就是代碼中的WebHttpBehavior類
好了,我現在服務位址也出來了:http://127.0.0.1:1920 ,然後服務方法的template也指定了。隻要http.sys監控到了template
比對的url,服務方法就會被執行,比如我現在在浏覽器裡面輸入:http://127.0.0.1:1920/HomeService/Get/1 來測試下Get操作。
可以看到,get方法成功了,也正确的比對了我的服務方法Get。
然後我們看看Add方法,我在HttpWebRequest中模拟測試如下。
View Code
好了,大概就說這麼多了,如果說你不嫌麻煩,你可以用WCF Rest,還有就是不要忘了很多的預設配置,如果你覺得太繁瑣,
可以用用asp.net web api。