• 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

  • 相关阅读:
    关于SEL数据类型的简单知识点
    小结RunLoop
    iOS-静态库的创建与使用
    MRC 下block 小结
    Native与H5交互的一些解决方法
    iOS UIPickerView 显示全国省市
    iOS开发 首次启动显示用户引导,第二次启动直接进入App,UIScrollView,UIPageControl,NSUserDefaults
    去掉tableView的header view的粘黏性
    黑苹果-IOS学习的开始
    IOS中程序如何进行推送消息(本地推送,远程推送)
  • 原文地址:https://www.cnblogs.com/flyfish2012/p/2931955.html
Copyright © 2020-2023  润新知