您好,登錄后才能下訂單哦!
第十一篇:REST調用
上篇寫的是Ajax調用WCF,今天寫一篇如何以REST方式調用WCF服務。不知道REST是什么的同學,可以去google一下。對某些類型的應用,REST還是相當不錯的方式,所以專門寫一篇來說明一下開發方法。
老規矩,上代碼,直接在代碼注釋里講解。
1、服務端:
服務契約,我們定義CRUD4個方法(增查改刪),對應HTTP METHOD分別為PUT/GET/POST/DELETE:
- using System;
- using System.ServiceModel;
- using System.ServiceModel.Web; //這個命名空間要求引入System.ServiceModel.Web.dll
- namespace Server
- {
- [ServiceContract(Namespace = "WCF.Demo")]
- public interface IData
- {
- //WebInvoke中標明REST的相關屬性,以這個方法為例,調用的Url是 ..../Data/key/data,HTTP方法是PUT,響應為Json格式(也可以換成xml)
- //這樣如果客戶端用PUT方法訪問 ..../Data/1/100,就會映射到CreateData方法上來,并且傳入key=1,data=100
- [OperationContract]
- [WebInvoke(UriTemplate = "Data/{key}/{data}", Method = "PUT", ResponseFormat = WebMessageFormat.Json)]
- void CreateData(string key, string data);
- [OperationContract]
- [WebInvoke(UriTemplate = "Data/{key}", Method = "GET", ResponseFormat = WebMessageFormat.Json)]
- string RetrieveData(string key);
- [OperationContract]
- [WebInvoke(UriTemplate = "Data/{key}/{data}", Method = "POST", ResponseFormat = WebMessageFormat.Json)]
- void UpdateData(string key, string data);
- [OperationContract]
- [WebInvoke(UriTemplate = "Data/{key}", Method = "DELETE", ResponseFormat = WebMessageFormat.Json)]
- void DeleteData(string key);
- }
- }
然后是實現類,這個簡單,沒什么可說的。
- using System;
- using System.Collections.Generic;
- using System.ServiceModel;
- namespace Server
- {
- //這個例子中用了Single Instance模式,這樣m_DataDict的值才能保留住
- [ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)]
- public class DataProvider : IData
- {
- private Dictionary<string, string> m_DataDict = new Dictionary<string, string>();
- public void CreateData(string key, string data)
- {
- m_DataDict[key] = data;
- }
- public string RetrieveData(string key)
- {
- return m_DataDict.ContainsKey(key) ? m_DataDict[key] : "NOT FOUND";
- }
- public void UpdateData(string key, string data)
- {
- m_DataDict[key] = data;
- }
- public void DeleteData(string key)
- {
- m_DataDict.Remove(key);
- }
- }
- }
配置文件最關鍵了,注意里面綠色的注釋部分:
- <?xml version="1.0" encoding="utf-8" ?>
- <configuration>
- <system.serviceModel>
- <services>
- <service name="Server.DataProvider">
- <!--必須使用webHttpBinding,而且要定義此endpoint的behaviorConfiguration(見后)-->
- <endpoint address="" binding="webHttpBinding" contract="Server.IData" behaviorConfiguration="restBehavior" />
- <host>
- <baseAddresses>
- <add baseAddress="http://localhost:8080/wcf" />
- </baseAddresses>
- </host>
- </service>
- </services>
- <behaviors>
- <!--定義endpoint的behavior,webHttp節點表示啟用web方式訪問,這對REST是非常關鍵的-->
- <endpointBehaviors>
- <behavior name="restBehavior">
- <webHttp/>
- </behavior>
- </endpointBehaviors>
- </behaviors>
- </system.serviceModel>
- </configuration>
最后發布服務,沒什么特殊的,和以前一樣:
- using System;
- using System.ServiceModel;
- namespace Server
- {
- class Program
- {
- static void Main(string[] args)
- {
- using(ServiceHost host = new ServiceHost(typeof(Server.DataProvider)))
- {
- host.Open();
- Console.WriteLine("Running ...");
- Console.ReadKey();
- host.Close();
- }
- }
- }
- }
這個服務端沒有用IIS做HOST,直接用自己的進程做的宿主(當然了,本質還是http.sys在工作)。
2、客戶端
我們這回要用REST形式訪問服務端,所以不是普通意義上的WCF客戶端了,再也用不著那么麻煩的寫配置文件創建Channel或者代理了。
- using System;
- using System.Net;
- namespace Client
- {
- class Program
- {
- static void Main(string[] args)
- {
- //用一個WebClient就可以搞定了
- var client = new WebClient();
- //以PUT方式訪問Data/1/100,會映射到服務端的CreateData("1", "100")
- client.UploadString("http://localhost:8080/wcf/Data/1/100", "PUT", string.Empty);
- //以GET方式訪問Data/1,會映射到服務端的RetrieveData("1"),應該返回"100"
- Console.WriteLine(client.DownloadString("http://localhost:8080/wcf/Data/1"));
- //以POST方式訪問Data/1/200,會映射到服務端的UpdateData("1", "200")
- client.UploadString("http://localhost:8080/wcf/Data/1/200", "POST", string.Empty);
- //再GET一次,應該返回"200"
- Console.WriteLine(client.DownloadString("http://localhost:8080/wcf/Data/1"));
- //以DELETE方式訪問Data/1,會映射到服務端的DeleteData("1")
- client.UploadString("http://localhost:8080/wcf/Data/1", "DELETE", string.Empty);
- //再GET一次,應該返回"NOT FOUND"
- Console.WriteLine(client.DownloadString("http://localhost:8080/wcf/Data/1"));
- }
- }
- }
OK,運行一下客戶端,返回如下,和預期一致:
需要補充一下,如果用IIS做HOST,比如DataService.svc.cs是實現類,一定要在DataService.svc中加上Factory,如下:
- <%@ ServiceHost Language="C#" Debug="true" Service="WebServer.DataService" CodeBehind="DataService.svc.cs" Factory="System.ServiceModel.Activation.WebServiceHostFactory" %>
表明不是使用默認的ServiceHostFactory,而是適應WEB HTTP開發的WebServiceHostFactory。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。