zoukankan      html  css  js  c++  java
  • [收藏转贴]WCFRESTFul服务搭建及实现增删改查

    RESTful Wcf是一种基于Http协议的服务架构风格,  RESTful 的服务通常是架构层面上的考虑。 因为它天生就具有很好的跨平台跨语言的集成能力,几乎所有的语言和网络平台都支持 HTTP 请求,无需去实现复杂的客户端代理,无需使用复杂的数据通讯方式既可以将我们的服务暴露给任何需要的人,无论他使用 VB、Ruby、JavaScript,甚至是 HTML FORM,或者直接在浏览器地址栏输入

        WCF 中通过 WebGetAttribute、WebInvokeAttribute (GET/PUT/POST/DELETE)、UriTemplate 定义 REST 的服务的调用方式, 通过 WebMessageFormat (Xml/Json) 定义消息传递的格式。

    RESTful的几点好处(引用博文):

    1、简单的数据通讯方式,基于HTTP协议。避免了使用复杂的数据通讯方式。

    2、避免了复杂的客户端代理。

    3、直接通过URI资源定向即可把服务暴露给调用者。

    下面就通过一个简单的列子一步一步实现WCFRESTFul

    1、  新建如下项目

       

    2、  项目文件介绍

    (1)     IService1.cs 定义服务契约,在接口方法中定义RestFul请求规则

    (2)     Service1.svc 实现IService1.cs定义的服务契约。

    (3)     People.cs 数据契约,定义的实体对象

    (4)     Global.asax 全局资源文件中定义注册路由

    (5)     Web.config 配置WCF服务。

    3、  IService1.cs接口定义三个方法,包含GET和POST请求

    复制代码
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Runtime.Serialization;
    using System.ServiceModel;
    using System.ServiceModel.Web;
    using System.Text;
    namespace WcfRestFulService
    
    {
    
        // NOTE: You can use the "Rename" command on the "Refactor" menu to change the interface name "IService1" in both code and config file together.
    
        [ServiceContract(Name="user")]
        public interface IService1
        {
            [OperationContract]
    
            [WebInvoke(UriTemplate = "get/{value}",  Method = "GET", ResponseFormat = WebMessageFormat.Json, RequestFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.Bare)]
    
            string GetData(string value);
    
            [OperationContract]
    
            [WebInvoke(UriTemplate = "add", Method = "POST", ResponseFormat = WebMessageFormat.Json, RequestFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.Bare)]
    
            string addPeople(People p);
    
            [OperationContract]
    
            [WebInvoke(UriTemplate = "GetList/{value}", Method = "GET", ResponseFormat = WebMessageFormat.Json, RequestFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.Bare)]
    
            List<People> GetList(string value);
    
        }
    
     
    
    }
    复制代码

    注意:通过WebInvoke属性的Method值说明该请求的类型,UriTemplate值说明url路由。接口中[ServiceContract(Name="user")]的定义,我们的URL路径中将会用到user

    4、  Service1.svc实现契约

    复制代码
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Runtime.Serialization;
    using System.ServiceModel;
    using System.ServiceModel.Web;
    using System.Text;
    using System.ServiceModel.Activation;
    namespace WcfRestFulService
    {
    
        // NOTE: You can use the "Rename" command on the "Refactor" menu to change the class name "Service1" in code, svc and config file together.
    
         [AspNetCompatibilityRequirements(
            RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
        public class Service1 : IService1
        {
            public string GetData(string value)
            {
                return string.Format("You entered: {0}", value);
            }
    
            public string addPeople(People p)
             {
                 if (p == null)
                 {
                     return "People is Null";
                 }
                 return p.Name;
             }
    
            public List<People> GetList(string value)
    
            {
    
                return new List<People> { new People(){Id=1,Name="eric"}};
    
            }
        }
    }
    复制代码

    注意:[AspNetCompatibilityRequirements( RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]的定义跟我们在webconfig中的一个配置相关,我们 在下文中详细介绍。

    5、  Global全局资源文件,注册服务的路由:

    复制代码
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Web.Security;
    using System.Web.SessionState;
    using System.Web.Routing;
    using System.ServiceModel.Activation;
    namespace WcfRestFulService
    {
        public class Global : System.Web.HttpApplication
        {
            protected void Application_Start(object sender, EventArgs e)
            {
                RegistrRoutes();
            }
            private void RegistrRoutes()
            {
                //说明:ServiceRoute需要引用 System.ServiceModel.Activation.dll
                RouteTable.Routes.Add(new ServiceRoute("user", new WebServiceHostFactory(), typeof(Service1)));
            }
        }
    }
    复制代码

    6、  Web.config配置文件

    复制代码
    <?xml version="1.0"?>
    <configuration>
      <system.web>
        <compilation debug="true" targetFramework="4.0" />
      </system.web>
      <system.serviceModel>
        <behaviors>
          <serviceBehaviors>
            <behavior name="defaultResultBehavior">
              <!-- To avoid disclosing metadata information, set the value below to false and remove the metadata endpoint above before deployment -->
              <serviceMetadata httpGetEnabled="true"/>
              <!-- To receive exception details in faults for debugging purposes, set the value below to true.  Set to false before deployment to avoid disclosing exception information -->
              <serviceDebug includeExceptionDetailInFaults="false"/>
              <dataContractSerializer maxItemsInObjectGraph="6553500"/>
            </behavior>
          </serviceBehaviors>
          <endpointBehaviors>
            <behavior name="defaultRestEndpointBehavior">
              <webHttp helpEnabled="true" automaticFormatSelectionEnabled="true" />
              <dataContractSerializer maxItemsInObjectGraph="6553500"/>
            </behavior>
            </endpointBehaviors>
        </behaviors>
        <services>
          <service name="WcfRestFulService.Service1" behaviorConfiguration="defaultResultBehavior">
            <endpoint binding="webHttpBinding" contract="WcfRestFulService.IService1" behaviorConfiguration="defaultRestEndpointBehavior"></endpoint>
          </service>
        </services>
        <serviceHostingEnvironment multipleSiteBindingsEnabled="true" aspNetCompatibilityEnabled="true" />
      </system.serviceModel>
     <system.webServer>
        <modules runAllManagedModulesForAllRequests="true"/>
      </system.webServer>
    </configuration>
    复制代码

    说明:在配置文件中我们看<serviceHostingEnvironment multipleSiteBindingsEnabled="true" aspNetCompatibilityEnabled="true" />节点,如果使aspNetCompatibilityEnabled="true"必须在Service1.svc声明 [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)],其中RequirementsMode的值也可以为 AspNetCompatibilityRequirementsMode. Required

    至此我们的WCFRESFul搭建成功,运行服务看效果。

    1、  http://localhost:9315/Service1.svc(传统的页面,是不是很熟悉)

    2、http://localhost:9315/user/help(RESTFul的风格,是不是眼前一亮

    3、  通过RESTFul风格调用服务

    (1)、http://localhost:9315/user/get/1调用服务string GetData(string value),参数值为1

    (2)、http://localhost:9315/user/add 调用string addPeople(People p)服务

     

    下面我们开始创建一个简答的ajax调用列子测试一下WC FRESTFul服务

    注意:如果你是用VS自带的IIS调试,WCF RESTFul生成的URL与调用WCF服务的URL端口号要保持一致,要不然用ajax调用浏览器会认为跨域。 比如:http://localhost:9315/user/get/1http://localhost:9315/Default.aspx

    我是采用win7系统的IIS 7调试的。

    服务地址配置为:http://localhost/wfcrestful/user/help

    调用服务的Web页面的地址为:http://localhost/restfulTest/WebForm1.aspx

     

    调用服务string GetData(string value)

    $.get("http://localhost/wfcrestful/user/get/1", function (json) { alert(json) });

    调用服务:string addPeople(People p)

    复制代码
    $.ajax({
                "url": "http://localhost/wfcrestful/user/add",
                "type": "POST",
                "contentType": "application/json",
                "dataType": "json",
                "data": '{"Id":1,"Name":"我是输入的内容"}',
                "success": function (returnValue) {
                alert(returnValue);               
                }
    
                });
    复制代码

    调用服务GetList(string value)

    $.get("http://localhost/wfcrestful/user/GetList/22", function (json) {
                    alert(json[0].Name);
                })

    至此整个DEMO已经完成,请点击下载源码。

    PS:WCF RESTFul已经是过时的技术了,有兴趣的童鞋们可以研究一下 MVC WebApi

    文中有些的不对的地方欢迎大家指正。

  • 相关阅读:
    springmvc乱码问题
    51nod 还是01串
    51nod 1276 岛屿的数量
    poj 2486 a apple tree
    hdu 1011 Starship Troopers
    poj 1155 TELE
    hdu 4586 Play the Dice
    hdu 5023 A Corrupt Mayor's Performance Art(线段树水题)
    Appleman and Tree
    hdu 4003
  • 原文地址:https://www.cnblogs.com/redmondfan/p/3209278.html
Copyright © 2011-2022 走看看