WCF REST 工作總結(一)
最近工作中學習使用了WCF REST,REST 有很多好處 高效 簡約 面向資源 而客戶端調用 也變得非常簡單。REST 入門的資料等 大家可以去網上找 這里主要分享下遇到的問題以及解決~
一.環境準備
使用WCF REST 可以先下載一個模版 并大致預覽

下載好這個模版后 新建項目 選擇這個模版 會默認幫我們生成一個 CRUD 的代碼 新手朋友可以用這個快速熟悉下REST風格的WCF.
這這里還給我們提供了一個很方便的功能 help 只需在我們的服務后面 加上help 就能顯示服務的詳情與介紹了


二.搭建REST WCF服務
1.接口的實現

當我們的請求為 Get時 一般用來獲取數據時 使用[WebGet] 而 增加 修改 刪除 則使用[WebInvoke] 里面的Method 來決定使用POST 或PUT等 這里要注意下
Method 里的一定要為大寫 POST PUT等 否則會出現 HTTP 錯誤 405 405 不允許此方法 對于請求所標識的資源,不允許使用請求行中所指定的方法。
我們在這里 還可以通過 ResponseFormat 與 RequestFormat 來指定接受的參數與返回的參數格式
2.類繼承接口 這里先貼一部分 最基礎的CRUD


3. Global 里注冊路由

用過mvc的朋友 是不是發現這樣寫完后 非常的像mvc呢~
三.實現調用服務
1.實現get 服務
很簡單 我們可以直接通過瀏覽器 輸入 http://localhost:55914/ITaskService/Tasks/State/1 即可獲得state為1的所有數據 以json格式傳輸過來
rest 風格的wcf 使得我們不用再像以前一樣 客戶端 添加 服務引用了 沒有了wsdl 簡潔了許多 效率也提高了很多 使得我們訪問更容易
REST 由于沒有了代理 而是發送請求 我們的客戶端可以是 js 訪問 如果是 jquery 只需$.get 即可發送請求 這里我主要說下C#的訪問方式
通過WebClient 方式 這個類封裝的比較好 調用起來簡單 但由于封裝的過多 實現一些功能時則不太容易
通過WebRequest方式 這個則比較靈活
上面兩個是經常用到的兩個類 這里再推薦給大家一個 是wcf工具里的其中一個 專門用來訪問 rest 服務 也非常的簡單
通過HttpClient 這個也是微軟開發的工具類 而且在最新的 .net 4.5里 集成了進去
通過上面三個任意其中一個就可以實現提交了
但是 這里有一個問題 我們以前有代理類 通過調用方法 得到代理類 可是現在呢 我們沒有類 我們得到的是一串json 格式的數據 我們怎么把他變成像類一樣的 方便操作呢?
比如 A公司發布了rest wcf服務 數據格式 json 公司B 要調用A公司的服務 以前ws 或wcf都有代理 可以生成代理類 現在卻得到的是json數據 而我們還沒有要反序列化的實體類
比如 我現在想把得到的數據 像表格一樣的展示出來
有兩種方法
1.對照json數據 客戶端新建個類 然后通過反序列化 把json 反序列化為類對象
這樣比較麻煩 類少還可以 要是多了 則需要新建很多實體類 更關鍵的是 服務端的實體類 更新了 以前WCF或ws 更新下服務即可 而現在 還要更新客戶端實體類豈不是很麻煩?
所以推薦用下面的方法
2.將json 反序列話為 dynamic 類型
json 轉換為dynamic 類型 起初 我用的是 第三方的 json.net 經過嘗試 發現再把json 轉換為集合類型時 總是出錯 如果有朋友知道怎么弄 還望告知下
后來經過嘗試 我采用了 微軟自帶的 JavaScriptSerializer 下面展示代碼

使用方法很簡單 經過 不論是序列化 集合 還是單個的 都沒有問題 這個時間也會正常顯示 沒有問題~ 結果上面的代碼 就可以把接受的json 類型 展示為一個 table了
好了 這個問題解決了 可以上三種方式發送get請求了 這個畢竟簡單 大家直接看代碼

可以看到 第一個 和第三個 都是非常簡單的 這里要注意的是 要注意編碼問題 因為傳遞的有中文 會有亂碼問題
所以要注意編碼問題 再第二個里 可以通過得到response.ContentType 先得到編碼 這樣就可以自動識別編碼格式了
再說下HttpClient 這個真正發送請求 是在 message.EnsureStatusIsSuccessful(); 這句話
通過上面任意一種方法 我們都可以得到json 這樣再通過將json 反序列話為 dynamic 類型 就可以像有實體類一樣簡單的操作了~~
今天先寫到這
下面講post 等提交數據 以及 原生流文件的上傳 下載 等
最后 祝大家周末愉快 歡迎一起交流技術
參考:
http://blog.csdn.net/fangxinggood/article/details/6235662
原文:
http://www.rzrgm.cn/wlflovenet/archive/2011/10/28/WCFREST.html
浙公網安備 33010602011771號