亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

WCF簡單教程(11) REST調用

發布時間:2020-06-26 11:03:32 來源:網絡 閱讀:10334 作者:BoyTNT 欄目:編程語言

第十一篇:REST調用

上篇寫的是Ajax調用WCF,今天寫一篇如何以REST方式調用WCF服務。不知道REST是什么的同學,可以去google一下。對某些類型的應用,REST還是相當不錯的方式,所以專門寫一篇來說明一下開發方法。

老規矩,上代碼,直接在代碼注釋里講解。


1、服務端:

服務契約,我們定義CRUD4個方法(增查改刪),對應HTTP METHOD分別為PUT/GET/POST/DELETE:

  1. using System; 
  2. using System.ServiceModel; 
  3. using System.ServiceModel.Web;  //這個命名空間要求引入System.ServiceModel.Web.dll
  4.  
  5. namespace Server 
  6.     [ServiceContract(Namespace = "WCF.Demo")] 
  7.     public interface IData 
  8.     { 
  9.         //WebInvoke中標明REST的相關屬性,以這個方法為例,調用的Url是 ..../Data/key/data,HTTP方法是PUT,響應為Json格式(也可以換成xml) 
  10.         //這樣如果客戶端用PUT方法訪問 ..../Data/1/100,就會映射到CreateData方法上來,并且傳入key=1,data=100 
  11.         [OperationContract] 
  12.         [WebInvoke(UriTemplate = "Data/{key}/{data}", Method = "PUT", ResponseFormat = WebMessageFormat.Json)] 
  13.         void CreateData(string key, string data); 
  14.  
  15.         [OperationContract] 
  16.         [WebInvoke(UriTemplate = "Data/{key}", Method = "GET", ResponseFormat = WebMessageFormat.Json)] 
  17.         string RetrieveData(string key); 
  18.  
  19.         [OperationContract] 
  20.         [WebInvoke(UriTemplate = "Data/{key}/{data}", Method = "POST", ResponseFormat = WebMessageFormat.Json)] 
  21.         void UpdateData(string key, string data); 
  22.  
  23.         [OperationContract] 
  24.         [WebInvoke(UriTemplate = "Data/{key}", Method = "DELETE", ResponseFormat = WebMessageFormat.Json)] 
  25.         void DeleteData(string key); 
  26.     } 

然后是實現類,這個簡單,沒什么可說的。

  1. using System; 
  2. using System.Collections.Generic; 
  3. using System.ServiceModel; 
  4.  
  5. namespace Server 
  6.     //這個例子中用了Single Instance模式,這樣m_DataDict的值才能保留住 
  7.     [ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)] 
  8.     public class DataProvider : IData 
  9.     { 
  10.         private Dictionary<stringstring> m_DataDict = new Dictionary<stringstring>(); 
  11.  
  12.         public void CreateData(string key, string data) 
  13.         { 
  14.             m_DataDict[key] = data; 
  15.         } 
  16.  
  17.         public string RetrieveData(string key) 
  18.         { 
  19.             return m_DataDict.ContainsKey(key) ? m_DataDict[key] : "NOT FOUND"
  20.         } 
  21.  
  22.         public void UpdateData(string key, string data) 
  23.         { 
  24.             m_DataDict[key] = data; 
  25.         } 
  26.  
  27.         public void DeleteData(string key) 
  28.         { 
  29.             m_DataDict.Remove(key); 
  30.         } 
  31.     } 

配置文件最關鍵了,注意里面綠色的注釋部分:

  1. <?xml version="1.0" encoding="utf-8" ?> 
  2. <configuration> 
  3.     <system.serviceModel> 
  4.         <services> 
  5.             <service name="Server.DataProvider"> 
  6.          <!--必須使用webHttpBinding,而且要定義此endpoint的behaviorConfiguration(見后)--> 
  7.                 <endpoint address="" binding="webHttpBinding" contract="Server.IData" behaviorConfiguration="restBehavior" /> 
  8.                 <host> 
  9.                     <baseAddresses> 
  10.                         <add baseAddress="http://localhost:8080/wcf" /> 
  11.                     </baseAddresses> 
  12.                 </host> 
  13.             </service> 
  14.         </services> 
  15.  
  16.         <behaviors> 
  17.          <!--定義endpoint的behavior,webHttp節點表示啟用web方式訪問,這對REST是非常關鍵的--> 
  18.             <endpointBehaviors> 
  19.                 <behavior name="restBehavior"> 
  20.                     <webHttp/> 
  21.                 </behavior> 
  22.             </endpointBehaviors> 
  23.         </behaviors> 
  24.     </system.serviceModel> 
  25. </configuration> 

最后發布服務,沒什么特殊的,和以前一樣:

  1. using System; 
  2. using System.ServiceModel; 
  3.  
  4. namespace Server 
  5.     class Program 
  6.     { 
  7.         static void Main(string[] args) 
  8.         { 
  9.             using(ServiceHost host = new ServiceHost(typeof(Server.DataProvider))) 
  10.             { 
  11.                 host.Open(); 
  12.                 Console.WriteLine("Running ..."); 
  13.                 Console.ReadKey(); 
  14.                 host.Close(); 
  15.             } 
  16.         } 
  17.     } 

這個服務端沒有用IIS做HOST,直接用自己的進程做的宿主(當然了,本質還是http.sys在工作)。

 


2、客戶端

我們這回要用REST形式訪問服務端,所以不是普通意義上的WCF客戶端了,再也用不著那么麻煩的寫配置文件創建Channel或者代理了。

  1. using System; 
  2. using System.Net; 
  3.  
  4. namespace Client 
  5.     class Program 
  6.     { 
  7.         static void Main(string[] args) 
  8.         { 
  9.          //用一個WebClient就可以搞定了 
  10.             var client = new WebClient(); 
  11.  
  12.      //以PUT方式訪問Data/1/100,會映射到服務端的CreateData("1", "100") 
  13.      client.UploadString("http://localhost:8080/wcf/Data/1/100""PUT"string.Empty); 
  14.  
  15.      //以GET方式訪問Data/1,會映射到服務端的RetrieveData("1"),應該返回"100" 
  16.      Console.WriteLine(client.DownloadString("http://localhost:8080/wcf/Data/1")); 
  17.  
  18.      //以POST方式訪問Data/1/200,會映射到服務端的UpdateData("1", "200")             
  19.     client.UploadString("http://localhost:8080/wcf/Data/1/200""POST"string.Empty); 
  20.  
  21.      //再GET一次,應該返回"200" 
  22.      Console.WriteLine(client.DownloadString("http://localhost:8080/wcf/Data/1")); 
  23.  
  24.      //以DELETE方式訪問Data/1,會映射到服務端的DeleteData("1") 
  25.      client.UploadString("http://localhost:8080/wcf/Data/1""DELETE"string.Empty); 
  26.  
  27.      //再GET一次,應該返回"NOT FOUND" 
  28.          Console.WriteLine(client.DownloadString("http://localhost:8080/wcf/Data/1")); 
  29.         } 
  30.     } 


OK,運行一下客戶端,返回如下,和預期一致:

WCF簡單教程(11) REST調用

 

需要補充一下,如果用IIS做HOST,比如DataService.svc.cs是實現類,一定要在DataService.svc中加上Factory,如下:

  1. <%@ ServiceHost Language="C#" Debug="true" Service="WebServer.DataService" CodeBehind="DataService.svc.cs" Factory="System.ServiceModel.Activation.WebServiceHostFactory" %> 

表明不是使用默認的ServiceHostFactory,而是適應WEB HTTP開發的WebServiceHostFactory。

 

 

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

二连浩特市| 江永县| 嘉荫县| 灵川县| 乐清市| 蓬安县| 永济市| 章丘市| 台安县| 凤山县| 南安市| 阜新| 靖西县| 乌拉特后旗| 静安区| 大英县| 房产| 故城县| 韶山市| 兴义市| 砀山县| 德惠市| 铁力市| 襄汾县| 星座| 华蓥市| 增城市| 嘉祥县| 漳州市| 沁阳市| 乌兰浩特市| 太仓市| 渝中区| 台南市| 当阳市| 宝坻区| 布尔津县| 威海市| 德钦县| 瑞昌市| 瑞丽市|