上面我介绍了在.NET(3.0/3.5)开发WCF的使用示例。
这篇,我将讲解Rest 这个炙手可热的新的开发方式,至于rest 是什么,请大家百度下。
我们还是以下面的方式做示例:
服务接口-》服务-》客户端
1.服务接口:数据接口
using System.ServiceModel; using System.ServiceModel.Web; //这里就是REST 要关键引用的类 using System.Runtime.Serialization; namespace Wcf.IProductService { [ServiceContract] public interface IProduct { //REST 四个 GET POST PUT DELETE [OperationContract] //注意.NET3.5必须要带这个 4.0 开始就可以取消了 [WebGet(UriTemplate = "all", ResponseFormat = WebMessageFormat.Xml)] List<Product> GetAll(); /*IEnumerable<Product> GetAll(); 在.NET3.5不可以 4.0就可以 很郁闷 找了2天 问题依旧 后来把 IEnumerable改成List 问题解决 原因.NET4.0 对IEnumerable增加了新特性 */ [OperationContract] [WebGet(UriTemplate = "{id}")] Product Get(string id); //添加 其中路径为/ [OperationContract] [WebInvoke(UriTemplate = "/", Method = "POST")] void Create(Product product); //更新 [OperationContract] [WebInvoke(UriTemplate = "/", Method = "PUT")] void Update(Product product); //删除 [OperationContract] [WebInvoke(UriTemplate = "{id}", Method = "DELETE")] void Delete(string id); } }
数据成员:
using System.Runtime.Serialization; //序列化 namespace Wcf.IProductService { [DataContract(Namespace = "http://yuhao.com")] public class Product { [DataMember] public string Id { get; set; } [DataMember] public string ProductName { get; set; } [DataMember] public string Price { get; set; } } }
2.服务:config配置
<system.serviceModel> <!--注意这里传统的WCF区别--> <services> <service name="Server.ProductService"> <!--这里只有服务名称 没有行为--> <endpoint address="http://127.0.0.1:1808/ProductService" binding="webHttpBinding" contract="Wcf.IProductService.IProduct" /> <!--Address(地址) 提高访问地址 可以自己设置--> <!--Binding(绑定) 提供访问的模式 --> <!--Contract(契约) 表示的是提高的接口 带命名空间--> <!--大家看到了没有 多简单没有 那个复杂的元数据--> </service> </services> </system.serviceModel>
实现服务类
using Wcf.IProductService; using System.ServiceModel.Web; namespace Server { public class ProductService:IProduct { public static List<Product> products = new List<Product>() { new Product{Id="1",ProductName="Iphone4s",Price="3788"}, new Product{Id="2",ProductName="Ipad3",Price="3288"} }; #region IProduct 成员 //public IEnumerable<Product> GetAll() .net 3.5 不支持 害我调试半天 public List<Product> GetAll() { return products; } public Product Get(string id) { Product product = products.FirstOrDefault(p => p.Id == id); if (null == product) { return null; } return product; } public void Create(Product product) { products.Add(product); } public void Update(Product product) { this.Delete(product.Id); products.Add(product); } public void Delete(string id) { Product product = this.Get(id); if (null != product) { products.Remove(product); } } #endregion } }
开启服务类 :
using System.ServiceModel; using System.ServiceModel.Web;//这个类是关键 using Wcf.IProductService; namespace Server { class Program { static void Main(string[] args) { using (WebServiceHost host = new WebServiceHost(typeof(ProductService))) { host.Open(); Console.WriteLine("服务已启动"); Console.Read(); } } } }
3.客户端:config配置
<system.serviceModel> <behaviors> <endpointBehaviors> <behavior name="webBehavior"> <webHttp/> </behavior> </endpointBehaviors> </behaviors> <client> <endpoint name="Server.ProductService" address="http://127.0.0.1:1808/ProductService" behaviorConfiguration="webBehavior" binding="webHttpBinding" contract="Wcf.IProductService.IProduct"/> </client> </system.serviceModel>
客户端调用
ChannelFactory<IProduct> ChannelFactory = new ChannelFactory<IProduct>("Server.ProductService"); IProduct proxy = ChannelFactory.CreateChannel(); //Response.Write(proxy.Get("1").ProductName); Array.ForEach<Product>(proxy.GetAll().ToArray(), product => Response.Write(product.ProductName));
好了,代码到此就结束了,大家发现没有这个比传统的SOAP代码省多了 而且还很简单 太棒了!
大家在开发Rest的时候,尽量多注意.net版本,我就因为一个返回数组的问题,折腾2天!
下一篇,我将讲解.net 4.0 开发WCF 的开发方式 和以往更不同哦!