zoukankan      html  css  js  c++  java
  • 如何创建一个RESTful WCF Service

    原创地址:http://www.cnblogs.com/jfzhu/p/4044813.html

    转载请注明出处

    (一)web.config文件

    要创建REST WCF Service,endpoint binding需要用webHttpBinding,参见《webHttpBinding、basicHttpBinding和wsHttpBinding的区别》

    web.config

    <?xml version="1.0"?>
    <configuration>
        <system.web>
          <compilation debug="true" targetFramework="4.0" />
          <authentication mode="None" />
        </system.web>
        <system.serviceModel>
            <behaviors>
                <endpointBehaviors>
                    <behavior name="SandwichServices.CostServiceBehavior">                    
                        <webHttp helpEnabled="true"/>
                    </behavior>
                </endpointBehaviors>
                <serviceBehaviors>
                  <behavior name="SandwichServices.CostServiceServiceBehavior" >
                    <serviceMetadata httpGetEnabled="true" />
                  </behavior>
                </serviceBehaviors>
            </behaviors>
            <serviceHostingEnvironment aspNetCompatibilityEnabled="true"
                multipleSiteBindingsEnabled="true" />
            <services>
                <service name="SandwichServices.CostService" behaviorConfiguration="SandwichServices.CostServiceServiceBehavior">
                    <endpoint address="" behaviorConfiguration="SandwichServices.CostServiceBehavior"
                        binding="webHttpBinding" contract="SandwichServices.CostService" />
                  <endpoint contract="IMetadataExchange" binding="mexHttpBinding" address="mex" />
                </service>
            </services>
        </system.serviceModel>
    </configuration>

    《如何创建一个AJAX-Enabled WCF Service》中的web.config,因为需要AJAX,endpointBehaviors用了<enableWebScript />,但是enableWebScript 和REST需要的UriTemplate是有冲突的,所以这里不再使用。

    endpointBehaviors中设置<webHttp helpEnabled="true"/>可以生成WCF Service的Help页面。

    image

    HTTP定义了与服务器交互的不同方法,最基本的方法有4种,分别是GET,POST,PUT,DELETE。一个URL地址,它用于描述一个网络上的资源,而HTTP中的GET,POST,PUT,DELETE就对应着对这个资源的查,改,增,删4个操作。GET一般用于获取/查询资源信息,而POST一般用于更新资源信息。

    对于PUT和DELETE,需要身份验证信息,所以我们先暂时只允许匿名访问,在web.config中将authentication mode设置为None。

    (二)webHttpBinding的XML格式

    Employee.cs

    using System;
    using System.Runtime.Serialization;
    
    namespace SandwichServices
    {
        [DataContract]
        public class Employee
        {
            private Guid id;
            private string name;
            private DateTime birthdate;
    
            [DataMember]
            public Guid Id
            {
                get { return id; }
                set { id = value; }
            }
    
            [DataMember]
            public string Name
            {
                get { return name; }
                set { name = value; }
            }
    
            [DataMember]
            public DateTime Birthdate
            {
                get { return birthdate; }
                set { birthdate = value; }
            }
        }
    }

    CostService.svc.cs

    using System;
    using System.ServiceModel;
    using System.ServiceModel.Activation;
    using System.ServiceModel.Web;
    
    namespace SandwichServices
    {
        [ServiceContract(Namespace = "SandwichServices")]
        [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
        public class CostService
        {
            // To use HTTP GET, add [WebGet] attribute. (Default ResponseFormat is WebMessageFormat.Json)
            // To create an operation that returns XML,
            //     add [WebGet(ResponseFormat=WebMessageFormat.Xml)],
            //     and include the following line in the operation body:
            //         WebOperationContext.Current.OutgoingResponse.ContentType = "text/xml";
            [OperationContract]
            [WebInvoke(Method = "PUT", UriTemplate = "Employees/AddEmployee", ResponseFormat = WebMessageFormat.Xml)]
            public Guid AddEmployee(Employee employee)
            {
                return Guid.NewGuid();
            }
    
            [OperationContract]
            [WebInvoke(Method = "DELETE", UriTemplate = "Employees/DeleteEmployee?id={id}", ResponseFormat = WebMessageFormat.Xml)]
            public void DeleteEmployee(string id)
            {
                return;
            }
    
            [OperationContract]
            [WebInvoke(Method = "POST", UriTemplate = "Employees/UpdateEmployee", ResponseFormat = WebMessageFormat.Xml)]
            public void UpdateEmployee(Employee employee)
            {
                return;
            }
    
            [OperationContract]
            [WebGet(UriTemplate = "Employees/GetEmployee?id={id}", ResponseFormat = WebMessageFormat.Xml)]
            public Employee GetEmployee(string id)
            {
                return new Employee() { Id = new Guid(id), Name = "Neil Klugman", Birthdate = new DateTime(1930, 1, 1) };
            }
        }
    }

    image

    image

    image

    image

    (三)webHttpBinding JSON格式

    将每个方法的ResponseFormat改为Json

    CostService.svc.cs

    using System;
    using System.ServiceModel;
    using System.ServiceModel.Activation;
    using System.ServiceModel.Web;
    
    namespace SandwichServices
    {
        [ServiceContract(Namespace = "SandwichServices")]
        [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
        public class CostService
        {
            // To use HTTP GET, add [WebGet] attribute. (Default ResponseFormat is WebMessageFormat.Json)
            // To create an operation that returns XML,
            //     add [WebGet(ResponseFormat=WebMessageFormat.Xml)],
            //     and include the following line in the operation body:
            //         WebOperationContext.Current.OutgoingResponse.ContentType = "text/xml";
            [OperationContract]
            [WebInvoke(Method = "PUT", UriTemplate = "Employees/AddEmployee", ResponseFormat=WebMessageFormat.Json)]
            public Guid AddEmployee(Employee employee)
            {
                return Guid.NewGuid();
            }
    
            [OperationContract]
            [WebInvoke(Method = "DELETE", UriTemplate = "Employees/DeleteEmployee?id={id}", ResponseFormat = WebMessageFormat.Json)]
            public void DeleteEmployee(string id)
            {
                return;
            }
    
            [OperationContract]
            [WebInvoke(Method = "POST", UriTemplate = "Employees/UpdateEmployee", ResponseFormat = WebMessageFormat.Json)]
            public void UpdateEmployee(Employee employee)
            {
                return;
            }
    
            [OperationContract]
            [WebGet(UriTemplate = "Employees/GetEmployee?id={id}", ResponseFormat = WebMessageFormat.Json)]
            public Employee GetEmployee(string id)
            {
                return new Employee() { Id = new Guid(id), Name = "Neil Klugman", Birthdate = new DateTime(1930, 1, 1) };
            }
        }
    }

    image

    image

    image

    image

    (四)总结

    1. RESTful WCF Service需要使用webHttpBinding
    2. endpointBehaviors不要用<enableWebScript />
    3. endpointBehaviors中设置<webHttp helpEnabled="true"/>可以生成WCF Service的Help页面
    4. GET(查),POST(改),PUT(增),DELETE(删)
    5. 对于PUT和DELETE,需要身份验证信息
    6. webHttpBinding的数据格式有两种:XML和JSON,可以通过ResponseFormat来设置

  • 相关阅读:
    js实现选择切换
    Jquery操作select
    Mybatis 高级结果映射 ResultMap Association Collection
    jQuery的一些特性和用法
    利用JSONP解决AJAX跨域问题的原理与jQuery解决方案
    List转成Array 连个Array比较
    3.15
    Get 和 Post 方法的选择和URL的设计
    fd
    如何维护一个1000 IP的免费代理池
  • 原文地址:https://www.cnblogs.com/jfzhu/p/4044813.html
Copyright © 2011-2022 走看看