WCF 配置服务 (02)

配置服务概述
• 在设计和实现服务协定后,即可配置服务。 在其中可以定义和自定义如何向客户端公开服务,包括指定可以找到服务的地址、服务用于发送和接收消息的传输和消息编码,以及服务需要的安全类型。
• 配置服务的类型
– 使用配置文件配置
–  在代码中强制配置

• 实际上,编写配置是 WCF 应用程序编程的主要部分。

• 使用配置文件配置WCF服务
– 通过使用配置文件配置 Windows Communication Foundation(WCF) 服务,可提供在部署时而非设计时提供终结点和服务行为的灵活性数据。
– 可使用 .NET Framework 配置技术对 WCF 服务进行配置。 通常情况下,向承载 WCF 服务的 Internet 信息服务 (IIS) 网站的
Web.config 文件添加 XML 元素。 通过这些元素,可以逐台计算机更改详细信息,例如终结点地址(用于与服务进行通信的实际
地址)。 此外,WCF 包括几个系统提供的元素,可用于快速选择服务的最基本的功能
– WCF 使用 .NET Framework 的 System.Configuration 配置系统
• 使用 IIS 来承载服务--使用 Web.config 文件 
• 使用任何其他宿主环境—使用或 App.config 文件指定设置

• Service元素
• 每个服务都具有以下属性:
– name。指定提供服务协定的实现的类型。 这是完全限定名称(命名空间和类型名称)。
– behaviorConfiguration。指定一个在 behaviors 元素中找到的behavior 元素的名称。 指定的行为控制操作,例如服务是否允许模拟。

[html] view plaincopy
 
  1. <service name="JianKunKing.NewVersion.Service.NewVersionService">  
  2.                 <endpoint   
  3.                 address=""   
  4.                 binding="basicHttpBinding"   
  5.                 bindingConfiguration="MyServiceBinding"   
  6.                 contract="JianKunKing.NewVersion.Service.INewVersionService">  
  7.                 </endpoint>             
  8.             </service>  

• endpoint元素
• 每个终结点都需要以下属性表示的地址、绑定和协定:– address。指定服务的统一资源标识符 (URI),它可以是一个绝对地址,或是一个相对于服务基址给定的地址。 如果设置为空字符串,则指示在创建服务的 ServiceHost 时,终结点在指定的基址上可用。
– binding。通常,指定一个类似 WsHttpBinding 的系统提供的绑定,但也可以指定一个用户定义的绑定。 指定的绑定确定传输协议类型、安全和使用的编码,以及是否支持或启用可靠会话、事务或流。
– bindingConfiguration。如果必须修改绑定的默认值,则可通过在bindings 元素中配置相应的 binding 元素来执行此操作。 此属性应赋予与用于更改默认值的 binding 元素的 name 属性相同的值。
– contract。指定定义协定的接口。 这是在由 service 元素的 name属性指定的公共语言运行库 (CLR) 类型中实现的接口。

[html] view plaincopy
 
  1. <service name="JianKunKing.NewVersion.Service.NewVersionService">  
  2.                 <endpoint   
  3.                 address=""   
  4.                 binding="basicHttpBinding"   
  5.                 bindingConfiguration="MyServiceBinding"   
  6.                 contract="JianKunKing.NewVersion.Service.INewVersionService">  
  7.                 </endpoint>             
  8.             </service>  

小注:

<endpoint> 元素MSDN讲解

当指定服务与契约类型时,必须使用类型全名(包含命名空间)。

• binding元素

[html] view plaincopy
 
  1. <configuration>  
  2.     <system.serviceModel>  
  3.         <bindings>  
  4.             <basicHttpBinding>  
  5.                 <binding name="myBindingConfiguration1" closeTimeout="00:01:00" />  
  6.                 <binding name="myBindingConfiguration2" closeTimeout="00:02:00"/>  
  7.             </basicHttpBinding>  
  8.         </bindings>  
  9.         <services>  
  10.             <service name="myServiceType">  
  11.                 <endpoint address="myAddress" binding="basicHttpBinding" bindingConfiguration= "myBindingConfiguration1" />  
  12.             </service>  
  13.         </services>  
  14.     </system.serviceModel>  
  15. </configuration>  

多少个binding都可以,只有与endpoint中对应起来的那个binding才会被执行

使用配置文件可以设置终结点使用的绑定。

因此,需要在endingpoint节中添加bingingConfiguration属性,它的值与binging配置中定制的绑定名一致。

• behaviors元素

[html] view plaincopy
 
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <configuration>  
  3.     <system.web>  
  4.         <compilation debug="true" targetFramework="4.0" />  
  5.     </system.web>  
  6.     <system.serviceModel>  
  7.         <bindings>  
  8.             <basicHttpBinding>  
  9.                 <binding   
  10.                 name="MyServiceBinding"    
  11.                 maxBufferSize="2147483647"   
  12.                 maxReceivedMessageSize="2147483647" >  
  13.                     <readerQuotas   
  14.                     maxArrayLength="2147483647"   
  15.                     maxBytesPerRead="2147483647"   
  16.                     maxDepth="2147483647"   
  17.                     maxNameTableCharCount="2147483647"   
  18.                     maxStringContentLength="2147483647"/>  
  19.                 </binding>  
  20.             </basicHttpBinding>  
  21.         </bindings>  
  22.         <services>  
  23.             <service name="JianKunKing.NewVersion.Service.NewVersionService">  
  24.                 <endpoint   
  25.                 address=""   
  26.                 binding="basicHttpBinding"   
  27.                 bindingConfiguration="MyServiceBinding"   
  28.                 contract="JianKunKing.NewVersion.Service.INewVersionService">  
  29.                 </endpoint>             
  30.             </service>  
  31.         </services>  
  32.         <behaviors>  
  33.             <serviceBehaviors>  
  34.                 <behavior>  
  35.                     <!-- 为避免泄漏元数据信息,请在部署前将以下值设置为 false 并删除上面的元数据终结点 -->  
  36.                     <serviceMetadata httpGetEnabled="true"/>  
  37.                     <!-- 要接收故障异常详细信息以进行调试,请将以下值设置为 true。在部署前设置为 false 以避免泄漏异常信息 -->  
  38.                     <serviceDebug includeExceptionDetailInFaults="false"/>  
  39.                 </behavior>  
  40.             </serviceBehaviors>  
  41.         </behaviors>  
  42.         <serviceHostingEnvironment multipleSiteBindingsEnabled="true" />  
  43.     </system.serviceModel>  
  44.     <system.webServer>  
  45.         <modules runAllManagedModulesForAllRequests="true"/>  
  46.     </system.webServer>  
  47. </configuration>  

绑定
• 绑定是用于指定连接到 Windows Communication Foundation (WCF)服务终结点所必需的通信详细信息的对象。 WCF 服务中的每个终结点都要求正确指定绑定。
• 绑定最起码必须指定要使用的传输(如 HTTP 或 TCP)。 还可以通过绑定来设置其他特征,如安全和事务支持。
• 绑定中的信息可能非常基本,也可能非常复杂。 最基本的绑定仅指定必须用于连接到终结点的传输协议(如 HTTP)。 一般来说,绑定包含的有关如何连接到终结点的信息属于以下类别中的一种。
– 协议
• 确定要使用的安全机制:可靠消息传递功能或事务上下文流设置。
–  编码
• 确定消息编码(例如,文本或二进制)。
– 传输
• 确定要使用的基础传输协议(例如,TCP 或 HTTP)。
• 绑定中的信息可能十分复杂,而且某些设置可能与其他设置不兼容。 因此,WCF 包含一组系统提供的绑定。 这些
绑定旨在满足大多数应用程序要求。 下面的类表示系统提供的绑定的一些示例:
– BasicHttpBinding:一个 HTTP 协议绑定,适用于连接到符合WS-I 基本配置文件规范的 Web 服务(例如,基于 ASP.NETWeb 服务的服务)。
– WSHttpBinding:一个可互操作的绑定,适用于连接到符合 WS-*协议的终结点。
– NetNamedPipeBinding:使用 .NET Framework 连接到同一计算机上的其他 WCF 终结点。
– NetMsmqBinding:使用 .NET Framework 创建与其他 WCF 终结点的排队消息连接。
• 使用自己的绑定
– 如果系统提供的绑定都不具有服务应用程序所需的正确功能组合,则可以创建自己的绑定。 有两种方法可以实现此目的。
–  可以使用 CustomBinding 对象从预先存在的绑定元素创建新的绑定
– 也可以通过从 Binding 绑定派生来创建完全由用户定义的绑定
• 使用绑定
– 使用绑定需要执行两个基本步骤:
– 选择或定义绑定。 最简单的方法就是选择 WCF 包含的系统提供绑定中的一个,并且通过该绑定的默认设置来使用它。
– 创建一个使用所选择或定义的终结点。

• 代码和配置
– 可以通过两种方式来定义绑定:
– 通过代码或通过配置。
– 这两种方法与您使用的是系统提供的绑定还是自定义绑定无关。通常,使用代码可以使在设计时对绑定的定义拥有完全的控制。
– 另一方面,使用配置则使系统管理员或 WCF 服务或客户端的用户可以更改绑定的参数,而不必重新编译服务应用程序。 由于无法预测用于部署 WCF 应用程序的特定计算机要求,因而通常需要这种灵活性。 通过将绑定(和寻址)信息保持在代码外部,人们可以更改这些信息,而不必重新编译或重新部署应用程序。
– 请注意,代码中定义的绑定是在配置中指定的绑定之后创建的,这使得代码定义的绑定可以覆盖配置中定义的任何绑定。

终结点
• 与 Windows Communication Foundation (WCF) 服务的所有通信是通过该服务的终结点进行的。 利用终结点,客户端可访问 WCF 服务提供的功能
• 终结点的结构
– 地址。 地址唯一标识终结点并告知潜在客户服务的所在位置
–  绑定。 绑定指定如何与终结点进行通信
– 服务协定。 服务协定概述了终结点向客户端公开的功能
• 指定服务的终结点有两种方式
– 通过使用代码的强制方式或通过配置的声明方式。 在代码中定义终结点通常并不可行,因为已部署服务的绑定和地址通常不同于
开发服务时使用的绑定和地址。 一般而言,使用配置定义服务终结点比使用代码更为可行。 使绑定和寻址信息保持在代码之外可以在对它们进行更改后不必重新编译和重新部署应用程序。

终结点地址的定义
• 终结点的地址由 EndpointAddress 类表示,该类包含一个表示服务地址的统一资源定位符 (URI),
• 大多数传输的地址 URI 包含四个部分。 例如, “http://www.fabrikam.com:322/mathservice.svc/secureEndpoint”这个 URI 具有以下四个部分:
–  方案:http:
– 计算机:www.fabrikam.com
–(可选)端口:322
– 路径:/mathservice.svc/secureEndpoint

• 在配置文件中定义终结点地址

• 在代码中定义终结点地址

[csharp] view plaincopy
 
  1. Uri baseAddress = new Uri("http://localhost:8000/HelloService");  
  2.             string address = "http://localhost:8000/HelloService/MyService";  
  3.             using (ServiceHost serviceHost = new ServiceHost(typeof(HelloService), baseAddress))  
  4.             {  
  5.                 serviceHost.AddServiceEndpoint(typeof(IHello), new BasicHttpBinding(), address);  
  6.                 serviceHost.Open();  
  7.                 Console.WriteLine("Press <enter> to terminate service");  
  8.                 Console.ReadLine();  
  9.                 serviceHost.Close();  
  10.             }  

小注:

WCF可以多次提供同一地址给不同的终结点

元数据终结点地址

• Windows Communication Foundation (WCF) 服务通过发布一个或多个元数据终结点来发布元数据。
• 发布服务元数据之后,可以通过标准协议(如 WS- MetadataExchange (MEX) 和 HTTP/GET 请求)来使用
该元数据。
• 元数据终结点类似于其他服务终结点:它们都有一 个地址、一个绑定和一个协定,并且它们都可通过配置或使用 代码添加到服务主机
• 若要启用发布元数据终结点,必须将ServiceMetadataBehavior 服务行为添加到该服务。 默认情况下,WCF 服务不发布元数据终结点,所以必须将它们显式添加到服务才能为服务启用元数据发布。

小注:

本文整理自:徐长龙 跟我一起从零开始学WCF系列课程(2):配置服务 (Level 200) 教程

        演示demo:点击打开链接

原文地址:https://www.cnblogs.com/Alex80/p/5133222.html