REST调用
>上篇写的是Ajax调用WCF,今天写一篇如何以REST方式调用WCF服务。不知道REST是什么的同学,可以去google一下。对某些类型的应用,REST还是相当不错的方式,所以专门写一篇来说明一下开发方法。
老规矩,上代码,直接在代码注释里讲解。
1、服务端:
服务契约,我们定义CRUD4个方法(增查改删),对应HTTP
METHOD分别为PUT/GET/POST/DELETE:
- class="keyword">using System;
- class="keyword">using System.ServiceModel;
- class="keyword">using System.ServiceModel.Web;
//这个命名空间要求引入System.ServiceModel.Web.dll
-
- class="keyword">namespace Server
- {
- class="alt"> [ServiceContract(Namespace = class="string">"WCF.Demo")]
- class="keyword">public class="keyword">interface IData
- {
-
- class="comment">//这样如果客户端用PUT方法访问 ..../Data/1/100,就会映射到CreateData方法上来,并且传入key=1,data=100
- [OperationContract]
- class="alt"> [WebInvoke(UriTemplate = class="string">"Data/{key}/{data}", Method = class="string">"PUT", ResponseFormat = WebMessageFormat.Json)]
- void CreateData( class="keyword">string key, string data);
-
- [OperationContract]
- class="alt"> [WebInvoke(UriTemplate = class="string">"Data/{key}", Method = class="string">"GET", ResponseFormat = WebMessageFormat.Json)]
- string RetrieveData( class="keyword">string key);
-
- [OperationContract]
- class="alt"> [WebInvoke(UriTemplate = class="string">"Data/{key}/{data}", Method = class="string">"POST", ResponseFormat = WebMessageFormat.Json)]
- void UpdateData( class="keyword">string key, string data);
-
- [OperationContract]
- class="alt"> [WebInvoke(UriTemplate = class="string">"Data/{key}", Method = class="string">"DELETE", ResponseFormat = WebMessageFormat.Json)]
- void DeleteData( class="keyword">string key);
- }
- }
然后是实现类,这个简单,没什么可说的。
- class="keyword">using System;
- class="keyword">using System.Collections.Generic;
- class="keyword">using System.ServiceModel;
-
- class="keyword">namespace Server
- {
- class="comment">//这个例子中用了Single Instance模式,这样m_DataDict的值才能保留住
- [ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)]
- class="keyword">public class="keyword">class DataProvider : IData
- {
- class="keyword">private Dictionary<string, class="keyword">string> m_DataDict = class="keyword">new Dictionary<string, class="keyword">string>();
-
- class="keyword">public class="keyword">void CreateData( class="keyword">string key, string data)
- {
- class="alt"> m_DataDict[key] = data;
- }
-
- public class="keyword">string RetrieveData(string key)
- class="alt"> {
- class="keyword">return m_DataDict.ContainsKey(key) ? m_DataDict[key] : class="string">"NOT FOUND";
- class="alt"> }
-
- class="keyword">public class="keyword">void UpdateData( class="keyword">string key, string data)
- {
- class="alt"> m_DataDict[key] = data;
- }
-
- public class="keyword">void DeleteData( class="keyword">string key)
- class="alt"> {
- m_DataDict.Remove(key);
- class="alt"> }
- }
- }
配置文件最关键了,注意里面绿色的注释部分:
- class="tag-name">xml class="attribute">version= class="attribute-value">"1.0" class="attribute">encoding= class="attribute-value">"utf-8" class="tag">?>
- < class="tag-name">configuration class="tag">>
- class="tag"><system.serviceModel class="tag">>
- class="tag"><services class="tag">>
- class="alt"> class="tag">< class="tag-name">service class="attribute">name= class="attribute-value">"Server.DataProvider" class="tag">>
-
- class="alt"> class="tag">< class="tag-name">endpoint class="attribute">address= class="attribute-value">"" class="attribute">binding= class="attribute-value">"webHttpBinding" contract= class="attribute-value">"Server.IData" behaviorConfiguration= class="attribute-value">"restBehavior" />
- class="tag"><host class="tag">>
- class="alt"> class="tag"><baseAddresses>
- class="tag">< class="tag-name">add class="attribute">baseAddress="http://localhost:8080/wcf" class="tag">/>
- class="alt"> class="tag">baseAddresses class="tag">>
- class="tag">host class="tag">>
- class="alt"> class="tag">service class="tag">>
- class="tag">services>
-
- class="tag"><behaviors>
-
class="comments">
- class="tag"><endpointBehaviors class="tag">>
- class="alt"> class="tag">< class="tag-name">behavior class="attribute">name= class="attribute-value">"restBehavior" class="tag">>
- class="tag"><webHttp class="tag">/>
- class="alt"> class="tag">behavior>
- class="tag">endpointBehaviors class="tag">>
- class="tag">behaviors>
- system.serviceModel class="tag">>
- class="tag-name">configuration class="tag">>
最后发布服务,没什么特殊的,和以前一样:
- class="keyword">using System;
- class="keyword">using System.ServiceModel;
-
- class="keyword">namespace Server
- {
- class="keyword">class Program
- {
- static class="keyword">void Main( class="keyword">string[] args)
- class="alt"> {
- class="keyword">using(ServiceHost host = class="keyword">new ServiceHost( class="keyword">typeof(Server.DataProvider)))
- class="alt"> {
- host.Open();
- class="alt"> Console.WriteLine( class="string">"Running ...");
- Console.ReadKey();
- class="alt"> host.Close();
- }
- class="alt"> }
- }
- }
>这个服务端没有用IIS做HOST,直接用自己的进程做的宿主(当然了,本质还是http.sys在工作)。
2、客户端
>我们这回要用REST形式访问服务端,所以不是普通意义上的WCF客户端了,再也用不着那么麻烦的写配置文件创建Channel或者代理了。
class="Apple-style-span">
- class="keyword">using System;
- class="keyword">using System.Net;
-
- class="keyword">namespace Client
- {
- class="keyword">class Program
- {
- static class="keyword">void Main( class="keyword">string[] args)
- class="alt"> {
-
- class="alt"> var client = class="keyword">new WebClient();
-
- class="comment">//以PUT方式访问Data/1/100,会映射到服务端的CreateData("1", "100")
- client.UploadString("http://localhost:8080/wcf/Data/1/100", class="string">"PUT", class="keyword">string.Empty);
-
- class="comment">//以GET方式访问Data/1,会映射到服务端的RetrieveData("1"),应该返回"100"
-
Console.WriteLine(client.DownloadString( class="string">"http://localhost:8080/wcf/Data/1"));
-
- class="comment">//以POST方式访问Data/1/200,会映射到服务端的UpdateData("1", "200")
- client.UploadString( class="string">"http://localhost:8080/wcf/Data/1/200", class="string">"POST", class="keyword">string.Empty);
-
- class="comment">//再GET一次,应该返回"200"
-
Console.WriteLine(client.DownloadString( class="string">"http://localhost:8080/wcf/Data/1"));
-
- class="comment">//以DELETE方式访问Data/1,会映射到服务端的DeleteData("1")
- client.UploadString("http://localhost:8080/wcf/Data/1", class="string">"DELETE", class="keyword">string.Empty);
-
- class="comment">//再GET一次,应该返回"NOT FOUND"
-
Console.WriteLine(client.DownloadString( class="string">"http://localhost:8080/wcf/Data/1"));
- }
- }
- }
>需要补充一下,如果用IIS做HOST,比如DataService.svc.cs是实现类,一定要在DataService.svc中加上Factory,如下:
- <%@ ServiceHost Language= class="string">"C#" Debug= class="string">"true" Service= class="string">"WebServer.DataService" CodeBehind= class="string">"DataService.svc.cs" Factory= class="string">"System.ServiceModel.Activation.WebServiceHostFactory" %>
表明不是使用默认的ServiceHostFactory,而是适应WEB
HTTP开发的WebServiceHostFactory。>
本文出自 “兔子窝” 博客,请务必保留此出处http://boytnt.blog.51cto.com/966121/860724