WCF学习之旅—WCF服务配置(十四)

Posted DotNet菜园

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了WCF学习之旅—WCF服务配置(十四)相关的知识,希望对你有一定的参考价值。

一、概述

  我们在前面章节中讲了寄宿,在前面的实例中也用到了配置文件,这一篇主要讲讲如何在应用配置文件,提高WCF程序的灵活性。在编写WCF服务应用程序时,编写配置项也是其中一项主要工作,在前面的几个示例中我也使用过配置文件,通过配置文件来简化代码。WCF通过公开终结点,向客户端公开服务,包括服务的地址、服务用于发送和接收消息的传输和消息编码,以及服务需要的安全类型等。当我们把这些配置项写入到配置文件后,我们无需编译即可修改WCF的一些可变信息,提高了程序的灵活性。

注意:

1)在代码里写了配置,那么配置文件中的配置项将不起作用。

  2) Web程序在Web.config中配置,应用程序中在App.config中配置。

  WCF能够建立一个跨平台的安全、可信赖、事务性的解决方案,是一个WebService,.Net Remoting,Enterprise Service,WSE,MSMQ的并集,有一副很经典的对比图如下:

WCF与其他分布式技术对比表

二、WCF中的 "A","B","C" 介绍

  我们先看个生活中的例子,某一天,O2O公司接到一份上门美甲服务订单,美甲师上门服务的过程可以选择的交通方式为“电动车”、“公交”、“地铁”,到了客户的家里,你要找到客户,服务完成之后,需要一份客户的服务评价和付款确认。

  要完成这项工作任务我们执行以下几个主要的步骤:

  (1)我们首先要知道客户所在的地址,引出WCF中的"A"。

  A(Address):英文理解为"地址",在计算机中是通过一个URI唯一地址标识,通过这个地址我们可以找到我们要调用的WCF服务。

  (2)美甲师还要选择相应的交通方式,每种交通方式达到的结果不一样。如:电动车需要自备车辆,时间上视道路情况而定。公交最便宜,并且可选择多条线路,时间可控性差。地铁最方便,但是偶尔会很挤,一般都没座等等,引出WCF中的"B"。

       B(Binding):英文理解为"捆绑,绑定", Binding实现在 客户端和服务端通信的所有底层细节。比如客户端与服务端之间传递的Message是如何编码的—— text/XML, binary,MTOM;这种Message的传递是采用的哪种Transport——TCP, Http, Named Pipe, MSMQ; 以及采用怎样的机制解决Secure Messaging的问题——SSL,Message Level Security。

       (3)到了客户家里之后我们能做哪些事?I.给客户美甲,II.拿服务评价与付款确认。我们不能要求客户给其他的东西,引出WCF中的"C"。

        C(Contract):英文理解为"合同",合同是什么?告诉我们哪些事能做,如些事不能做。 Contract的主要的作用是暴露某个WCF Service所提供的所有有效的方法。Contract实际上是把每个方法的转化成为相对应的消息。从Message Exchange的层面上讲,Contract实际上是抱每个操作转化成为相对应的Message Exchange Pattern——MEP(Request/Response; One-way; Duplex)

         4) Behavior: Behavior的主要作用是定制Endpoint在运行时的一些必要的Behavior。比如服务端回调客户端时超时了;客户端采用的Credential type;以及是否支持Transaction等。

 

三、Endpoint(终结点)

  WCF实现了网络系统的各个应用程序的通信。各个应用程序的通信是以“终结点(Endpoint)”的来实现的。我们在上面讲的实际例子中的A、B、C即是Endpoint 的组成部分,他是服务器间通信调用的入口。

四、应用程序间通信

  我们在第二和第三项中讲了A、B、C与Endpoint,现在正式进入应用程序间的通信。我们还是以刚才上门美甲的过程为例:

 

  美甲师手里有一张订单,标记着:地址、绑定、合同.....而客户手里也有一张订单,标记着同样的内容,并且一直得在等待美甲师的出现。只有当订单上的内容一样时,美甲师才会替客户服务,客户在服务完成之后会进行服务评价与付款确认。

  当我们寄宿WCF服务的时候,我们必须定义一个或是多个终结点,然后 服务端通过监听这些终结点来处理客户端发来的请求。由于应用程序之间是靠Endpoint来通信,那么我们在客户端也必须定义终 结点,只有当客户端与服务端的终结点完全匹配的时候才能进行通信。

 

  如上图所示:只有EndpointA中的A、B、C与EndPointB中的A、B、C完全匹配时才能通信。EndPointE与EndpointD也是一样的。

五、实例

1)服务配置的主要部分

  在.config中配置文件中的configuration节点下面有:<system.serviceModel></system.serviceModel>节点,在这个节点中主要有三个平级的部分。如下代码所示:

 

 <?xml version="1.0" encoding="utf-8"?>
   <configuration>
     <system.serviceModel>
       <!--配置服务和终结点开始-->
       <services>
         <service>
           <endpoint></endpoint>
         </service>
      </services>
      <!--配置服务和终结点结束-->
      <!--配置绑定开始-->
      <bindings>
        <netTcpBinding>
          <binding>
          </binding>
        </netTcpBinding>
      </bindings>
      <!--配置绑定结束--> 
      <!--配置行为开始-->
      <behaviors>
        <serviceBehaviors>
          <behavior>
          </behavior>
        </serviceBehaviors>
      </behaviors>
      <!--配置行为结束--> 
    </system.serviceModel>
  </configuration>

 

 

  Service配置节[必须有]:配置服务、接口和终结点。每个Service都会有以下两个属性。name:名称空间.类名[服务的具体实现类]。behaviorConfiguration:一个在behaviors节点中找到的名称。

  Binding配置节[可有可无]:配置绑定,如http,tcp等

  Behavior配置节[可有可无]:配置行为,如认证等。

2)实例

 

<?xml version="1.0"?>
<configuration>
  <system.web>
    <compilation debug="true"/>
  </system.web>
  <!-- When deploying the service library project, the content of the config file must be added to the host\'s

  app.config file. System.Configuration does not support config files for libraries. -->
  <system.serviceModel>
    <protocolMapping>
      <add scheme="http" binding="basicHttpBinding"/>
      <add scheme="net.tcp" binding="netTcpBinding"/>
      <add scheme="net.pipe" binding="netNamedPipeBinding"/>
      <add scheme="net.msmq" binding="netMsmqBinding"/>

</protocolMapping>
  <!--服务-->
<services>

<!--name:名称空间.类型名-->
<!--behaviorConfiguration:behavior的名称,请看behavior配置节的名称-->
 
      <service behaviorConfiguration="simpleBehavior" name="WCFService.WCFService" >

   <!-- 除非完全限定,否则地址将与上面提供的基址相关,每个服务可以有多个Endpoint -->
         <!-- Address:指定这个Endpoint对外的URI,这个URI可以是个绝对地址,也可以是个相对于baseAddress的

                       相对地址。如果此属性为空,则这个Endpoint的地址就是baseAddress-->

      <!--bindingConfiguration:binding的名称,请看binding配置节的名称-->
        <endpoint  name="endpointService"
           address="http://localhost:8000/WCFService"
           binding="basicHttpBinding"
           contract="WCFService.IWCFService">

        </endpoint>
        <!-- 此终结点不使用安全绑定,应在部署前确保其安全或将其删除--> 

        <!--<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />-->

        <host>
  <!-- 每种传输协议的baseAddress,用于跟使用同样传输协议Endpoint定义的相对地址组成完整的地址,

                 每种传输协议只能定义一个baseAddress。HTTP的baseAddress同时是service对外发布服务说明页面的URL -->

          <!--  <baseAddresses>
            <add baseAddress="http://localhost:8000/"/>
          </baseAddresses>-->
        </host>
      </service>
</services>
<!--行为-->

<behaviors>   

      <serviceBehaviors >
  <!-- httpGetEnabled - bool类型的值,表示是否允许通过HTTP的get方法获取sevice的WSDL元数据 --> 

        <behavior  name="simpleBehavior">

          <serviceMetadata httpGetEnabled="true"  httpGetUrl="http://localhost:8000/WCFService/metadata" />
          <serviceDebug includeExceptionDetailInFaults="false"/>

        </behavior>
      </serviceBehaviors>
</behaviors>
  <!--绑定-->

    <bindings>

      <basicHttpBinding></basicHttpBinding>
      <basicHttpContextBinding></basicHttpContextBinding>

      <netMsmqBinding></netMsmqBinding>
      <netNamedPipeBinding></netNamedPipeBinding>
      <webHttpBinding></webHttpBinding>

      <wsHttpBinding>
        <binding >
          <security mode="Transport">
            <transport clientCredentialType="None">
            </transport>
            <message clientCredentialType="Certificate"/>

          </security>
        </binding>
      </wsHttpBinding>
      <wsDualHttpBinding></wsDualHttpBinding>
    </bindings> 

  </system.serviceModel>

  <startup>

    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/>

  </startup>

</configuration>

 

 

结果如下图:

 

以上是关于WCF学习之旅—WCF服务配置(十四)的主要内容,如果未能解决你的问题,请参考以下文章

WCF学习之旅—WCF服务部署到应用程序

WCF学习之旅—WCF概述

WCF学习之旅—WCF4.0中的简化配置功能(十五)

WCF学习之旅-创建第一个服务

WCF学习大全

WCF学习之旅—第三个示例(二十七)