WCF系列之.net(3.0/3.5)Rest使用示例

上面我介绍了在.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 的开发方式 和以往更不同哦!

示例代码WcfDemo(.net3.5)REST.zip

posted on 2013-02-25 13:18  ~紫鱼~  阅读(1429)  评论(0编辑  收藏  举报