复习WCF(3)----- 配置服务

 

概述:

首先明确一点,编写配置是WCF应用程序的主要组成部分。

在设计和实现服务协定后,即可配置服务。在其中可以定义和自定义如何向客户端公开服务,

包括指定可以找到服务的地址、服务用于发送和接收消息的传输消息编码,以及服务需要的安全类型

地址:让客户端能够发现并使用此服务

传输:消息的传输是用http协议,还是tcp/ip协议 还是什么其他的

消息编码:是纯文本格式呢,还是优化过的二进制格式呢 或者是什么其他的格式

安全类型:需不需要安全控制,需要怎样的安全控制

上面就是在配置里需要完成的工作

 

那怎么配置呢?

1.可以在配置文件中配置

2.在代码中配置

通过使用配置文件配置WCF服务,可提供在部署时而非设计时提供终结点和服务行为数据的灵活性

所以推荐使用配置文件,写在代码中难以修改 还要重新编译

如果使用IIS承载服务,则是使用web.config来配置

如果是使用其他宿主环境,比如wpf,windows窗体程序等,则是使用app.config来配置

 

配置一览:

 <!--所有的wcf配置都放在此节点里-->
  <system.serviceModel>
<!--******服务和终结点******--> <services> <service> <endpoint/> </service> </services> <!--******服务和终结点******--> <!--******绑定(可选)******--> <bindings> <binding> </binding> </bindings> <!--******绑定(可选)******--> <!--******行为(可选)******--> <behaviors> <behaviors> </behaviors> </behaviors> <!--******行为(可选)******--> </system.serviceModel>

note:services、bindings、behaviors这三个节点都是平级的,别把services写在了bindings里面,或者是bindings写在了behaviors里面

 

Services节点详细说明

Service元素:

每个服务都有以下属性

1.name。指定提供服务协定的实现的类型。这是完全限定名称(命名空间和类型名称)。

2.behaviorConfiguration 。指定一个在behaviors元素集合中找到的behavior元素的名称。指定的行为控制操作,例如服务是否允许模拟。

endpoint元素:

1.address 。指定服务的统一资源标识符(URI) ,它可以是一个绝对地址或是一个相对于服务基址给定的地址 如果设置为空字符 地址,

或是一个相对于服务基址给定的地址。如果设置为空字符串,则指示在创建服务的ServiceHost 时,终结点在指定的基址上可用。

2.binding。通常,指定一个类似WsHttpBinding的系统提供的绑定,但也可以指定一个用户定义的绑定。指定的绑定确定传输协议类

型、安全和使用的编码,以及是否支持或启用可靠会话、事务或 型、安全和使用的编码,以及是否支持或启用可靠会话、事务或流。

3.bindingConfiguration。如果必须修改绑定的默认值,则可通过在bindings 元素中配置相应的binding元素来执行此操作

此属性 bindings 元素中配置相应的binding 元素来执行此操作。此属性应赋予与用于更改默认值的binding 元素的name 属性相同的值。

4.contract 。指定定义协定的接口。这是在由service元素的name属性指定的类型

address为空,所以服务会使用基址baseAddress

这里没有使用bindingConfiguration,使用的就是默认的绑定。可以看到binding是"wsHttpBinding" 这是系统提供的绑定,

大部分情况下只要使用系统提供的就够了,因为系统根据我们实际的安全或者传输或者编码的需求 它定义了很多内置的绑定,这样对编程来说比较简洁

还有一个contract,他就是那个接口咯

note:如果大家面试的公司需求你了解WCF 问你什么是终结点(endpoint),你就说ABC。A-Address,B-Binding,C-Contract。

 

Bindings节点详细说明

如果你要在终结点改变一个默认的绑定,就通过bindingConfiguration来指定

上面的<basicHttpBinding><binding>********</basicHttpBinding> 就是指定更改系统内置的"basicHttpBinding"绑定的属性值

大家可以看到myBindingConfiguration1和myBindingConfiguration2,在终结点endpoint里面指定的是myBindingConfiguration1

这个示例指的就是 你更改了系统内置的绑定"basicHttpBinding"的终结点关闭时间为1分钟 

当然,如果你将终结点的bindingConfiguration改为myBindingConfiguration2,那就是你更改了系统内置的"basicHttpBinding"绑定的终结点关闭时间为2分钟 

 

Behaviors节点详细说明

 

其实behaviors与终结点的关系,和bindings与终结点关系是差不多的 写法也差不多 相信大家从上下的代码上就能看出来

都是在behaviors(或者bindings)里面配置一个东西 ,在将它的name应用到终结点Configuration里这样来指定他们的对应关系

includeExceptionDetaillnFaults="true"的意思就是:如果wcf在执行的期间出错了,它就会把错误的具体信息给返回回来

 

所以总结就是,之所以配置,是因为它的方便和易维护,具有极强的灵活性。我们可以根据具体的因素和需求,只要更改配置文件就能达到目的

 

 

绑定的细节

绑定是用于指定连接到wcf服务终结点所必需的通信详细信息的对象 WCF服务中的每个终结 服务终结点所必需的通信详细信息的对象

那它包含什么呢? 比如说我们绑定最起码要指定 我们要使用什么传输(http还是tcp),还可以通过绑定设置其他的特征,比如安全和事务

比如上一篇文章里的双工模式,就是必须要使用wsDualHttpBinding才能执行回调。最基本的绑定仅仅只需要指定必须用于连接到终结点的传输协议(如HTTP)

一般来说,绑定包含的有关如何连接到终结点的信息属于以下类别中的一种。

1.协议

确定要使用的安全机制:可靠消息传递功能或事务上下文流设置。

2.编码

确定消息编码(例如,文本或二进制)。

3.传输

确定要使用的基础传输协议(例如 TCP 或HTTP) • 确定要使用的基础传输协议(例如,TCP 或HTTP)。

 

绑定中的信息可能十分复杂,而且某些设置可能与其他设置不兼容 因此WCF包含 组系统提供的绑定 这些 置不兼容。因此,WCF 包含一组系统提供的绑定。这些

绑定旨在满足大多数应用程序要求。下面的类表示系统提供的绑定的一些示例:

– BasicHttpBinding :一个HTTP 协议绑定,适用于连接到符合WS-I 基本配置文件规范的Web 服务(例如,基于ASP.NET Web 服务的服务)。

– WSHttpBinding :一个可互操作的绑定,适用于连接到符合WS-*协议的终结点。它包含了安全处理、认证、授权、消息加密,比BasicHttpBinding要安全

– NetNamedPipeBinding:使用.NET Framework 连接到同一计算机上的其他WCF 终结点。性能会比较高

– NetMsmqBinding:使用.NET Framework 创建与其他WCF 终结点的排队消息连接。

这只是内置绑定的其中一部分

 

以wsHttpBinding为例:

        <bindings>
          <!--wsHttpBinding主要还是配置security-->
          <wsHttpBinding>
            <binding name="binding1" messageEncoding="消息的编码方式Text或者Mtom" openTimeout="终结点打开的时间,超过这时间就出错"
                     receiveTimeout="调用这个wcf服务的时候,它的接收最长的时间是多少">
              <security mode="Message">
                <message clientCredentialType="Windows"/>
              </security>
              
              <!--可靠会话配置-->
              <reliableSession></reliableSession>
            </binding>
          </wsHttpBinding>
        </bindings>

上面都用注视解释了

可以看到 可以直接对binding的属性进行设置,如果将binding1应用到某个终结点,那这个wcf服务就会按照这些设置来工作

当然属性还有很多很多,就不逐一介绍了,大家可以翻阅相关手册或帮助文档了解 

behaviors的配置和bindings也是一样的,如果翻阅一下手册就能明白了

 

代码控制的方式  以上一篇的双工模式为例 更改Program:

 class Program
    {
        static void Main(string[] args)
        {
            string baseAddress = "http://localhost:8732/Design_Time_Addresses/WcfServiceLibrary1/CalculatorService/";

            BasicHttpBinding binding1 = new BasicHttpBinding();
            binding1.CloseTimeout = new TimeSpan(0, 2, 0);

            using (ServiceHost host = new ServiceHost(//实现服务协定的类型,比如 typeof(CalculatorService)))
            {
                host.AddServiceEndpoint(typeof(ICalculatorDuplex), binding1, baseAddress);
                if (host.State == CommunicationState.Closed)
                {
                    host.Open();
                }

                if(host.State == CommunicationState.Opened)
                {
                    host.Close();
                }
            }

当然这得把服务写在控制台程序里  不然访问不到CalculatorService

 

元素据:

(WCF) 服务通过发布一个或多个元数据终结点来发布元数据。

发布服务元数据之后,可以通过标准协议(如WS-MetadataE change (MEX) 和HTTP/GET 请求)来使用该元数据。

元数据终结点类似于其他服务终结点:它们都有一个地址、一个绑定和一个协定,并且它们都可通过配置或使用代码添加到服务主机。

若要启用发布元数据终结点,必须将ServiceMetadataBehavior 服务行为添加到该服务。默认情况下,WCF 服务不发布元数据终结点,所以必须将它

们显式添加到服务才能为服务启用元数据发布

address="mex"的为元数据

contract="IMetadataExchange"这个是必须这样写  

httpGetEnabled="True" 当客户端请求的时候 我们的服务就会自动的生成元数据给客户端 所以如果你改为False 就无法在添加服务引用里引用这个服务了

policyVersion="Policy12" 返回的元数据版本

 

其实可以发现 在右键添加服务引用的时候 下面框地址就是基址+mex,元数据就是这样请求的

而上面框中的那些服务方法,就是通过元数据找到的

所以 如果你把endpoint的元数据节点删掉 引用服务就会出错 因为这样就找不到它了

如下所示:

      <service name="WcfServiceLibrary1.Service1">
        <endpoint address="" binding="wsHttpBinding" contract="WcfServiceLibrary1.IService1">
          <identity>
            <dns value="localhost" />
          </identity>
        </endpoint>
        <!--注释掉元数据-->
        <!--<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />-->
        <host>
          <baseAddresses>
            <add baseAddress="http://localhost:8732/Design_Time_Addresses/WcfServiceLibrary1/Service1/" />
          </baseAddresses>
        </host>
      </service>

 

这一篇主要是理论性的居多 脑子可能会暂时性不够用 有点消化不了

posted @ 2013-02-20 12:19  韬韬韬你羞得无礼  Views(250)  Comments(0)    收藏  举报