WCF学习之旅

 一、什么是REST

       表述性状态转移(Representational
State Transfer,REST),不是壹种标准,而是壹种软件架构风格。

      
基于REST的劳务与基于SOAP的劳动比较,品质、效能和易用性上都越来越高,而SOAP协议分外的繁杂和不透明。REST受到进一步多的Web服务供应商欢迎。近年来大部分供应商,如天猫商城、腾讯、google、亚马逊等都提供REST风格的服务。

 REST的关键条件是:

 一.互联网上的装有东西都可被架空为能源;

 二.各种财富都有1个唯一的能源标识符U中华VI;

 叁.使用正规措施操作资源;

 四.全部的操作都以无状态的;

 伍.通过缓存来增强品质。

       
REST (Representation State Transfer) 描
述了贰个架构样式的互连网种类,比如Web应用程序。它第四回出现在两千年 罗伊 Fielding 的博士随想中,他是HTTP规范的首要编写者之壹。REST 指的是1组架构约束规范和标准化。满意那么些约束规范和规格的应用程序或设计便是 RESTful。

      
使用REST做为业务逻辑接口是因为,从客户端到服务器的各种请求都无法不包蕴掌握请求所必备的音信。若是服务器在呼吁之间的任何时刻点重启,客户端不会获得布告。其余,无状态请求可以由别的可用服务器回答,那十一分适合云总结之类的环境。客户端能够缓存数据以创新性能。

       
在劳动器端,应用程序状态和作用能够分成种种能源。财富是1个妙趣横生的定义实体,它向客户端公开。财富的例子有:应用程序对象、数据库记录、算法等等。每一个财富都利用 U中华VI (Universal Resource Identifier) 获得一个旷世的地方。客户端应用的是正式的 HTTP协议进行能源访问,同时还足以采取标准的HTTP方法,比如 GET、PUT、POST 和 DELETE。

      
REST的叁个第1标准是系统一分配层,那意味组件不恐怕掌握它与之并行的中间层以外的零部件。通过将系统的少数意义界定在某一层,因而能够界定整个体系的扑朔迷离,促进了尾部的独立性。

      
当 REST 架构的牢笼规范作为三个完整应用时,将生成贰个得以增添到大气客户端的应用程序。它还降低了客户端和服务器之间的交互延迟。统一界面简化了全套连串框架结构,创新了子系统里面相互的可知性。REST 简化了客户端和服务器的兑现。

      
REST的财富表述方式得以是XML、HTML、JSON,或许其余随意的样式,那取决于服务提供商和消费服务的用户。

      
不过REST不是文武全才的。操作无状态也会带来巨大的安全难题,如何授权和表达用户?若是供给每便请求都饱含完整的身份和注明新闻,又怎么幸免新闻外泄?复杂的效果挑衅架构的易用性,那就须要在性质与功用间权衡,究竟该用REST依旧SOAP。  

 一、什么是REST

       表述性状态转移(Representational
State Transfer,REST),不是一种标准,而是1种软件架构风格。

      
基于REST的服务与基于SOAP的劳务相比较,质量、功能和易用性上都越来越高,而SOAP协议万分的扑朔迷离和不透明。REST受到越来越多的Web服务供应商欢迎。近日超过四分之一供应商,如天猫商城、腾讯、google、亚马逊(Amazon)等都提供REST风格的劳动。

 REST的主要标准是:

 一.互联网上的拥有东西都可被架空为财富;

 2.各类财富都有二个唯1的能源标识符U冠道I;

 叁.使用专业措施操作财富;

 四.全体的操作都以无状态的;

 5.通过缓存来增加品质。

       
REST (Representation State Transfer) 描
述了一个架构样式的网络种类,比如Web应用程序。它第3次出现在三千年 罗伊 Fielding 的大学生散文中,他是HTTP规范的首要编写者之1。REST 指的是一组架构约束规范和规范。满意这么些约束原则和条件的应用程序或设计便是 RESTful。

      
使用REST做为业务逻辑接口是因为,从客户端到服务器的各种请求都无法不带有精通请求所不能缺少的音信。如若服务器在伸手之间的任什么日期刻点重启,客户端不会获得公告。其它,无状态请求能够由其他可用服务器回答,那可怜适合云计算之类的环境。客户端能够缓存数据以立异品质。

       
在服务器端,应用程序状态和功效能够分成种种财富。财富是八个诙谐的概念实体,它向客户端公开。能源的事例有:应用程序对象、数据库记录、算法等等。各种能源都利用 U奥迪Q7I (Universal Resource Identifier) 得到一个无比的地点。客户端采用的是正规的 HTTP协议进行财富访问,同时还是能够动用正规的HTTP方法,比如 GET、PUT、POST 和 DELETE。

      
REST的三个至关心爱慕要原则是系统一分配层,那象征组件不可能明白它与之相互的中间层以外的零部件。通过将系统的少数意义界定在某壹层,因此可以界定整个类别的错综复杂,促进了尾巴部分的独立性。

      
当 REST 架构的牢笼原则作为3个完完全全应用时,将生成二个得以扩张到大气客户端的应用程序。它还下跌了客户端和服务器之间的竞相延迟。统1界面简化了全体种类架构,立异了子系统里头相互的可知性。REST 简化了客户端和服务器的达成。

      
REST的财富表述方式得以是XML、HTML、JSON,只怕别的随意的款式,那取决于服务提供商和消费服务的用户。

      
但是REST不是有勇有谋的。操作无状态也会拉动巨大的安全难题,怎么着授权和验证用户?如若供给每一遍请求都包涵完整的身份和认证消息,又何以制止消息走漏?复杂的职能搦战框架结构的易用性,那就须求在品质与效果间权衡,毕竟该用REST照旧SOAP。  

二、Rest的优点

  壹)缓存,使用 HTTP 向 RESTful
端点申请数量时,用到的 HTTP 动词是 GET。对于 GET
请求响应中回到的能源,能够用三种不一致的主意展开缓存。Conditional GET
正是可供选用的一种完成细节,客户端可以向劳动验证他的数目是不是为流行版本;RESTful
端点能够透过它进一步升高速度和可伸缩性。

  二)扩大,REST
鼓励每项能源蕴藏处理格外请求所需的有所要求状态。满足那1束缚时,RESTful
服务更易于扩充且能够未有动静。

  三)副效用,使用 GET 请求财富,RESTful
服务应该未有副效能(遗憾的是,与别的部分 REST
约束相比较,这一束缚更便于被打破)。

  四)幂等,统一接口其它五个常用到的机要
HTTP 动词是 PUT 和 DELETE。用户代理想要修改财富时最常使用 PUT,DELETE
能够自作者描述。要点(也正是“幂等”壹词所强调的)是你能够对格外能源数十次用到那七个动词,效果与第叁次利用相同——至少不会有其余别的影响。创设可信赖的分
布式系统时(即错误、网络故障或延缓大概造成数次履行代码),那1优点可提供有限支撑。

  5)互操作性许,三人将 SOAP
捧为确立客户端-服务器程序最具互操作性的点子。但有的语言和环境于今仍没有SOAP
工具包。有1对虽说有工具包,但使用的是旧标准,不可能担保与行使更新标准的工具包可信赖沟通。对于大部分操作,REST
仅要求有 HTTP 库(当然,XML 库平常也很有扶助),它的互操作性肯定强过任何
君越CP 技术(包含 SOAP)。

  六)简易性与此外优点相比较,那一亮点更主观一些,分化的人或者有区别的感想。对自作者而言,使用
REST 的简易性涉及到代表财富的 UKugaI 和归并接口。作为一名 Web
冲浪高手,小编精通在浏览器中输入区别的 UENCOREI
能够取得不相同的财富(有时也被誉为 U陆风X8I 或 URubiconL
黑客,但绝无恶意)。由于有多年使用 U中华VI 的经历,所以为能源布署 U奇骏I
对自作者来说一箭穿心。使用统1接口简化了付出进程,因为笔者不要为每一种须要树立的劳动塑造接口、约定或
API。接口(客户端与本身的服务交互的方法)由系统布局约束设置。

 

二、Rest的优点

  壹)缓存,使用 HTTP 向 RESTful
端点申请数量时,用到的 HTTP 动词是 GET。对于 GET
请求响应中回到的能源,能够用多样不一样的形式实行缓存。Conditional GET
就是可供选取的壹种实现细节,客户端能够向服务验证他的数据是或不是为新型版本;RESTful
端点能够通过它进一步升高速度和可伸缩性。

  二)扩展,REST
鼓励每项能源蕴藏处理十二分请求所需的具备要求状态。满意这一封锁时,RESTful
服务更易于扩大且能够未有动静。

  三)副功效,使用 GET 请求财富,RESTful
服务应该未有副功能(遗憾的是,与其它部分 REST
约束相比较,那壹羁绊更便于被打破)。

  四)幂等,统1接口此外七个常用到的显要
HTTP 动词是 PUT 和 DELETE。用户代理想要修改财富时最常使用 PUT,DELETE
能够本人描述。要点(也正是“幂等”一词所强调的)是你能够对新鲜财富数十次用到那三个动词,效果与第3回选拔相同——至少不会有别的其余影响。创设可相信的分
布式系统时(即错误、互联网故障或延缓可能导致数十次进行代码),那壹优点可提供保险。

  5)互操作性许,三个人将 SOAP
捧为确立客户端-服务器程序最具互操作性的艺术。但局地言语和环境到现在仍没有SOAP
工具包。有部分固然有工具包,但接纳的是旧标准,无法保险与利用更新标准的工具包可信交换。对于多数操作,REST
仅供给有 HTTP 库(当然,XML 库经常也很有支持),它的互操作性肯定强过任何
卡宴CP 技术(包含 SOAP)。

  陆)简易性与其他优点相比较,那1亮点更主观1些,不相同的人可能有分化的感触。对本人而言,使用
REST 的简易性涉及到代表能源的 ULX570I 和集合接口。作为一名 Web
冲浪高手,作者掌握在浏览器中输入分裂的 U安德拉I
能够获得不相同的财富(有时也被喻为 U哈弗I 或 UCR-VL
黑客,但绝无恶意)。由于有多年使用 U科雷傲I 的经验,所以为能源规划 UBMWX伍I
对自家的话百发百中。使用统一接口简化了开支进度,因为自身不必为各样供给建立的服务构建接口、约定或
API。接口(客户端与本身的劳务交互的主意)由系统布局约束设置。

 

三、WCF如何支撑Rest

      
WCF如何达成对于Rest援救的吗?弄清那或多或少是上学Rest WCF的机要。

       为了完结于对Rest的支撑,在 .NET
Framework 中,WCF 在 System.ServiceModel.Web
组件中新增了编制程序模型和局地基础架构部件。WCF
Web编制程序模型多少个至关心注重重要项目目正是:

   1)  WebGetAttribute 和
WebInvokeAttribute:

      
大家精通,在WCF中,对于措施的调用是依据SOAP的Action的,各样客户端发送的SOAP消息都须求钦点叁个Action
的值。那些Action的值和WCF服务的措施对应。每一种WCF服务端的操作都有一个特定的Action。通过
OperationContractAttribute.Action 属性设置。

  在Rest
WCF中,基于Action的法子调用转变为了基于U奥迪Q5I+Http动词的调用。也等于SOAP
Action=UKoleosI+Http动词。

  那种映射会由WebHttpDispatchOperationSelector
类型来成功,它会把客户端请求的UQashqaiI+Http动词,映射到特定的劳务方法上。

  WebGetAttribute 告诉服务形式应该响应
HTTP GET 请求。

  WebInvokeAttribute 私下认可映射为 HTTP
POST,但可将WebInvokeAttribute.Method 属性设置为扶助全体其余 HTTP
动词(PUT 和 DELETE 等)。例如:

     

    

   [WebGet(UriTemplate = "/Books/Get/{BookId}", BodyStyle = WebMessageBodyStyle.Bare)]
          [OperationContract]
          List<Books> GetBook(string BookId);



        [WebInvoke(Method = "POST", UriTemplate = "/Books/Add", BodyStyle = WebMessageBodyStyle.Bare)]
         [OperationContract]
         Result AddBook(Books book);

   2)  UriTemplate 和
UriTemplateTable:

      UriTemplate 一个意味着统一财富标识符
(U奥迪Q5I) 模板的类。能够定义服务操作的路径和HTTP动词。

  UriTemplateTable二个代表一组关联
UriTemplate
对象的类。也正是UriTemplate表。

     
从上边的例子代码,大家也能看到哪些采纳UriTemplate
定义服务操作的U大切诺基I和HTTP动词。

 

      3)   WebHttpBinding 和
WebHttpBehavior:

       WebHttpBinding允许开发人士通过
HTTP 请求(那几个请求使用“Plain old XML”(POX) 样式音讯,而不是接纳基于
SOAP 的音讯)来公开 WCF Web 服务,能够很有益的兑现REST。

       
与其它绑定分裂的是:必须选择WebHttpBehavior对劳动的终结点进行布局。还供给运用WebGetAttribute或WebInvokeAttribute属性将逐条服务操作映射到
ULANDI,同时定义调用和重回结果的新闻格式。

 

   WCF Web 编制程序模型允许开发职员通过
HTTP 请求(这几个请求使用节约能源的旧的“Plain old XML”(POX)
样式音信,而不是SOAP 的音讯)来公开 WCF服务。为了让客户端选拔 HTTP
请求与劳务拓展通信,必须采纳附加了
WebHttpBehavior
WebHttpBinding 对劳务的终结点进行配置。

   WebHttpBehavior 行为与
WebHttpBinding
绑定一起行使时,协助 WCF 公开和访问 Web
样式服务。WebServiceHost
会自动将此行为抬高到利用
WebHttpBinding
的终结点。例如:

        

<system.serviceModel>
    <bindings>
       <webHttpBinding>
         <binding name="RestWebBinding">

         </binding>

       </webHttpBinding>

     </bindings>
    <behaviors>
      <serviceBehaviors>
        <behavior name="metadataBehavior">
          <serviceMetadata httpGetEnabled="true" httpGetUrl="http://127.0.0.1:8888/BookService/metadata" />
          <serviceDebug includeExceptionDetailInFaults="True" />

        </behavior>
          <behavior name="RestServiceBehavior">

         </behavior>

      </serviceBehaviors>
       <endpointBehaviors>
         <behavior name="RestWebBehavior">
           <!--这里必须设置-->

           <webHttp />

         </behavior>

       </endpointBehaviors>
    </behaviors>

    <services>   

      <service name="SCF.WcfService.BookRestService" behaviorConfiguration="RestServiceBehavior">
         <endpoint address="http://127.0.0.1:8888/" behaviorConfiguration="RestWebBehavior"
                   binding="webHttpBinding" bindingConfiguration="RestWebBinding" contract="SCF.Contracts.IBookRestService">
         </endpoint>
       </service>
    </services>
  </system.serviceModel>

 

   4)WebServiceHost 和
WebServiceHostFactory:

     
为了协助Web编制程序模型,WCF框架提供二个新的宿主类型:WebServiceHost。它是二个
ServiceHost
派生类,它是对WCF Web 编制程序模型的互补。如若 WebServiceHost
在劳务表达中找不到终结点,则它将在劳动的基址中自动为 HTTP 和 HTTPS
基址成立1个暗许终结点。假使用户已在基址中明确布署终结点,则它不会自动创制终结点。WebServiceHost
会自动配置终结点的绑定,以便在平安虚拟目录中动用时与关系的 Internet
消息服务 (IIS) 安全设置一起使用。

  Web瑟维斯HostFactory在可动态成立WebServiceHost
Web宿主实例以响应传入音信的托管宿主环境中提供
WebServiceHost
的实例的工厂。

     

 

三、WCF怎样支持Rest

      
WCF怎么着促成对于Rest辅助的啊?弄清那或多或少是上学Rest WCF的显要。

       为了促成于对Rest的扶助,在 .NET
Framework 中,WCF 在 System.ServiceModel.Web
组件中新增了编制程序模型和有个别基础架构部件。WCF
Web编制程序模型多少个第3项目正是:

   1)  WebGetAttribute 和
WebInvokeAttribute:

      
大家领略,在WCF中,对于措施的调用是根据SOAP的Action的,各种客户端发送的SOAP新闻都亟需钦赐一个Action
的值。那几个Action的值和WCF服务的方法对应。每一个WCF服务端的操作都有1个特定的Action。通过
OperationContractAttribute.Action 属性设置。

  在Rest
WCF中,基于Action的秘诀调用转变为了基于USportageI+Http动词的调用。也正是SOAP
Action=UEvoqueI+Http动词。

  那种映射会由WebHttpDispatchOperationSelector
类型来完结,它会把客户端请求的U途达I+Http动词,映射到一定的劳务措施上。

  WebGetAttribute 告诉服务方法应该响应
HTTP GET 请求。

  WebInvokeAttribute 私下认可映射为 HTTP
POST,但可将WebInvokeAttribute.Method 属性设置为援助全数别的 HTTP
动词(PUT 和 DELETE 等)。例如:

     

    

   [WebGet(UriTemplate = "/Books/Get/{BookId}", BodyStyle = WebMessageBodyStyle.Bare)]
          [OperationContract]
          List<Books> GetBook(string BookId);



        [WebInvoke(Method = "POST", UriTemplate = "/Books/Add", BodyStyle = WebMessageBodyStyle.Bare)]
         [OperationContract]
         Result AddBook(Books book);

   2)  UriTemplate 和
UriTemplateTable:

      UriTemplate 二个代表统1能源标识符
(U奥迪Q3I) 模板的类。能够定义服务操作的门路和HTTP动词。

  UriTemplateTable一个象征壹组关联
UriTemplate
对象的类。也正是UriTemplate表。

     
从下边包车型客车例子代码,大家也能看到哪些行使UriTemplate
定义服务操作的UMuranoI和HTTP动词。

 

      3)   WebHttpBinding 和
WebHttpBehavior:

       WebHttpBinding允许开发职员通过
HTTP 请求(那些请求使用“Plain old XML”(POX) 样式消息,而不是使用基于
SOAP 的音信)来公开 WCF Web 服务,能够很有利的落到实处REST。

       
与别的绑定差异的是:必须利用WebHttpBehavior对劳动的终结点实行铺排。还须求选拔WebGetAttribute或WebInvokeAttribute属性将次第服务操作映射到
U昂科雷I,同时定义调用和重返结果的音信格式。

 

   WCF Web 编制程序模型允许开发人士通过
HTTP 请求(这一个请求使用节约能源的旧的“Plain old XML”(POX)
样式音信,而不是SOAP 的消息)来公开 WCF服务。为了让客户端应用 HTTP
请求与劳务拓展通讯,必须采取附加了
WebHttpBehavior
WebHttpBinding 对劳务的终结点进行陈设。

   WebHttpBehavior 行为与
WebHttpBinding
绑定一起利用时,帮衬 WCF 公开和做客 Web
样式服务。WebServiceHost
会自动将此行为增进到利用
WebHttpBinding
的终结点。例如:

        

<system.serviceModel>
    <bindings>
       <webHttpBinding>
         <binding name="RestWebBinding">

         </binding>

       </webHttpBinding>

     </bindings>
    <behaviors>
      <serviceBehaviors>
        <behavior name="metadataBehavior">
          <serviceMetadata httpGetEnabled="true" httpGetUrl="http://127.0.0.1:8888/BookService/metadata" />
          <serviceDebug includeExceptionDetailInFaults="True" />

        </behavior>
          <behavior name="RestServiceBehavior">

         </behavior>

      </serviceBehaviors>
       <endpointBehaviors>
         <behavior name="RestWebBehavior">
           <!--这里必须设置-->

           <webHttp />

         </behavior>

       </endpointBehaviors>
    </behaviors>

    <services>   

      <service name="SCF.WcfService.BookRestService" behaviorConfiguration="RestServiceBehavior">
         <endpoint address="http://127.0.0.1:8888/" behaviorConfiguration="RestWebBehavior"
                   binding="webHttpBinding" bindingConfiguration="RestWebBinding" contract="SCF.Contracts.IBookRestService">
         </endpoint>
       </service>
    </services>
  </system.serviceModel>

 

   4)WebServiceHost 和
WebServiceHostFactory:

葡萄娱乐场,     
为了协理Web编程模型,WCF框架提供二个新的宿主类型:Web瑟维斯Host。它是多少个
ServiceHost
派生类,它是对WCF Web 编制程序模型的补偿。如若 WebServiceHost
在劳务表明中找不到终结点,则它将在劳动的基址中机动为 HTTP 和 HTTPS
基址创设二个暗中同意终结点。如若用户已在基址中鲜明布置终结点,则它不会自行创造终结点。WebServiceHost
会自动配置终结点的绑定,以便在平安虚拟目录中使用时与涉及的 Internet
音信服务 (IIS) 安全设置壹起行使。

  WebServiceHostFactory在可动态创设WebServiceHost
Web宿主实例以响应传入信息的托管宿主环境中提供
WebServiceHost
的实例的厂子。