说明:本内容来自微软的webcast,讲师为徐长龙。为了用手机阅读方便点,抄录存为txt。
本次课程内容包括
• 配置服务概述
• 配置绑定
• 配置终结点
配置服务概述
• 在设计和实现服务协定后,即可配置服务。在其中可以
定义和自定义如何向客户端公开服务,包括指定可以找到
服务的地址、服务用于发送和接收消息的传输和消息编码,
以及服务需要的安全类型。
• 配置服务的类型
– 使用配置文件配置
– 在代码中强制配置
@@部署很不方便,需要重新编译。
• 实际上,编写配置是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 文件指定设置。
配置服务概述
<system.ServiceModel>
<services>
<service>
<endpoint/>
</service>
</services>
绑定(可选)
<bindings>
<binding>
</binding>
</bindings>
行为(可选)
<behaviors>
<behavior>
</behavior>
</behaviors>
</system.ServiceModel>
配置服务概述
• Service元素
• 每个服务都具有以下属性:
– name。指定提供服务协定的实现的类型。这是完全限定名称
(命名空间和类型名称)。
– behaviorConfiguration。指定一个在behaviors 元素中找到的
behavior 元素的名称。指定的行为控制操作,例如服务是否允许
模拟。@@使用那组行为
<service name="WcfServiceLibrary2.CalculatorService" behaviorConfiguration="WcfServiceLibrary2.Service1Behavior">
<behaviors>
<serviceBehaviors>
<behavior name="WcfServiceLibrary2.Service1Behavior">
• endpoint元素
• 每个终结点都需要以下属性表示的地址、绑定和协定:
– address。指定服务的统一资源标识符(URI),它可以是一个绝对
地址,或是一个相对于服务基址给定的地址。如果设置为空字符
串,则指示在创建服务的ServiceHost 时,终结点在指定的基址
上可用。
– binding。通常,指定一个类似WsHttpBinding 的系统提供的绑定,
但也可以指定一个用户定义的绑定。指定的绑定确定传输协议类
型、安全和使用的编码,以及是否支持或启用可靠会话、事务或
流。
– bindingConfiguration。如果必须修改绑定的默认值,则可通过在
bindings 元素中配置相应的 binding 元素来执行此操作。此属性
应赋予与用于更改默认值的binding 元素的name 属性相同的值。
– contract。指定定义协定的接口。这是在由service 元素的name
属性指定的公共语言运行库(CLR) 类型中实现的接口。
• endpoint元素
<!-- Service Endpoints -->
<!-- 除非完全限定,否则地址将与上面提供的基址相关 -->
<endpoint address ="" binding="wsDualHttpBinding" contract="WcfServiceLibrary2.ICalculatorDuplex">
@@address ="":空,使用服务的基地址。baseAddress
@@bindingConfiguration:没有就使用默认的。
• binding元素
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<system.serviceModel>
<bindings>
<basicHttpBinding>
<binding name="myBindingConfiguration1" closeTimeout="00:01:00" />
<binding name="myBindingConfiguration2" closeTimeout="00:02:00" />
</basicHttpBinding>
</bindings>
<services>
<service name="myServiceType">
<endpoint
address="myAddress" binding="basicHttpBinding"
bindingConfiguration="myBindingConfiguration1" />
</service>
</services>
</system.serviceModel>
</configuration>
@@ endpoint 的binding="basicHttpBinding"关联bindings.basicHttpBinding
@@ endpoint 的bindingConfiguration关联了——bindings.basicHttpBinding.binding name="myBindingConfiguration2"
• behaviors元素
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<system.serviceModel>
<behaviors>
<endpointBehaviors>
<behavior name="myBehavior">
<callbackDebug includeExceptionDetailInFaults="true" />
</behavior>
</endpointBehaviors>
</behaviors>
<services>
<service name="NewServiceType">
<endpoint
address="myAddress" behaviorConfiguration="myBehavior"
binding="basicHttpBinding" />
</service>
</services>
</system.serviceModel>
</configuration>
绑定
• 绑定是用于指定连接到Windows Communication Foundation (WCF)
服务终结点所必需的通信详细信息的对象。WCF 服务中的每个终结
点都要求正确指定绑定。
• 绑定最起码必须指定要使用的传输(如HTTP 或TCP)。还可以通
过绑定来设置其他特征,如安全和事务支持。
• 绑定中的信息可能非常基本,也可能非常复杂。最基本的绑定仅指定
必须用于连接到终结点的传输协议(如HTTP)。一般来说,绑定包
含的有关如何连接到终结点的信息属于以下类别中的一种。
– 协议
• 确定要使用的安全机制:可靠消息传递功能或事务上下文流设置。
– 编码
• 确定消息编码(例如,文本或二进制)。
– 传输
• 确定要使用的基础传输协议(例如,TCP 或 HTTP)。
• 绑定中的信息可能十分复杂,而且某些设置可能与其他设
置不兼容。因此,WCF 包含一组系统提供的绑定。这些
绑定旨在满足大多数应用程序要求。下面的类表示系统
提供的绑定的一些示例:
– BasicHttpBinding:一个HTTP 协议绑定,适用于连接到符合
WS-I 基本配置文件规范的Web 服务(例如,基于ASP.NET
Web 服务的服务)。
– WSHttpBinding:一个可互操作的绑定,适用于连接到符合WS-*
协议的终结点。
– NetNamedPipeBinding:使用.NET Framework 连接到同一计算
机上的其他WCF 终结点。
– NetMsmqBinding:使用.NET Framework 创建与其他WCF 终结
点的排队消息连接。
• 使用自己的绑定
– 如果系统提供的绑定都不具有服务应用程序所需的正确功能组合,
则可以创建自己的绑定。有两种方法可以实现此目的。
– 可以使用CustomBinding 对象从预先存在的绑定元素创建新的绑
定
– 也可以通过从Binding 绑定派生来创建完全由用户定义的绑定
• 使用绑定
– 使用绑定需要执行两个基本步骤:
– 选择或定义绑定。最简单的方法就是选择WCF 包含的系统提供
绑定中的一个,并且通过该绑定的默认设置来使用它。
– 创建一个使用所选择或定义的绑定的终结点。
• 代码和配置
– 可以通过两种方式来定义绑定:
– 通过代码或通过配置。
– 这两种方法与您使用的是系统提供的绑定还是自定义绑定无关。
通常,使用代码可以使在设计时对绑定的定义拥有完全的控制。
– 另一方面,使用配置则使系统管理员或WCF 服务或客户端的用
户可以更改绑定的参数,而不必重新编译服务应用程序。由于无
法预测用于部署WCF 应用程序的特定计算机要求,因而通常需
要这种灵活性。通过将绑定(和寻址)信息保持在代码外部,人
们可以更改这些信息,而不必重新编译或重新部署应用程序。
– 请注意,代码中定义的绑定是在配置中指定的绑定之后创建的,
这使得代码定义的绑定可以覆盖配置中定义的任何绑定。
终结点
• 与Windows Communication Foundation (WCF) 服务的
所有通信是通过该服务的终结点进行的。利用终结点,
客户端可访问WCF 服务提供的功能
• 终结点的结构
– 地址。地址唯一标识终结点并告知潜在客户服务的所在位置
– 绑定。绑定指定如何与终结点进行通信
– 服务协定。服务协定概述了终结点向客户端公开的功能
• 指定服务的终结点有两种方式
– 通过使用代码的强制方式或通过配置的声明方式。在代码中定义
终结点通常并不可行,因为已部署服务的绑定和地址通常不同于
开发服务时使用的绑定和地址。一般而言,使用配置定义服务终
结点比使用代码更为可行。使绑定和寻址信息保持在代码之外可
以在对它们进行更改后不必重新编译和重新部署应用程序。
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<system.serviceModel>
<bindings>
<basicHttpBinding>
<binding name="myBindingConfiguration1" closeTimeout="00:01:00" />
<binding name="myBindingConfiguration2" closeTimeout="00:02:00" />
</basicHttpBinding>
</bindings>
<services>
<service name="myServiceType">
<endpoint
address="myAddress" binding="basicHttpBinding"
bindingConfiguration="myBindingConfiguration1" />
</service>
</services>
</system.serviceModel>
</configuration>
终结点地址的定义
• 终结点的地址由EndpointAddress 类表示,该类包含一个
表示服务地址的统一资源定位符(URI),
• 大多数传输的地址URI 包含四个部分。例如,
“http://www.fabrikam.com:322/mathservice.svc/secure
Endpoint”这个URI 具有以下四个部分:
– 方案:http:
– 计算机:www.fabrikam.com
– (可选)端口:322
– 路径:/mathservice.svc/secureEndpoint
• 在配置文件中定义终结点地址
<system.serviceModel>
<services>
<service
name="Microsoft.ServiceModel.Samples.CalculatorService"
behaviorConfiguration="CalculatorServiceBehavior">
<host>
<baseAddresses>
<add baseAddress="http://localhost:8000/ServiceModelSamples/service"/>
</baseAddresses>
</host>
<endpoint address=""
binding="wsHttpBinding"
contract="Microsoft.ServiceModel.Samples.ICalculator" />
<endpoint address="/test"
binding="wsHttpBinding"
contract="Microsoft.ServiceModel.Samples.ICalculator" />
Model.Samples.ICalculator" />
<endpoint address="net.tcp://localhost:9000/servicemodelsamples/service"
binding="netTcpBinding"
contract="Microsoft.ServiceModel.Samples.ICalculator" />
<!-- the mex endpoint is another reltive address explosed at
http://localhost:8000/ServiceModelSamples/service/mex -->
<endpoint address="mex"
binding="mexHttpBinding"
contract="IMetadataExchange" />
</service>
</services>
• 在代码中定义终结点地址
Uri baseAddress = new Uri("http://localhost:8000/HelloService");
string address = "http://localhost:8000/HelloService/MyService";
using (ServiceHost serviceHost = new ServiceHost(typeof(HelloService),
baseAddress))
{
serviceHost.AddServiceEndpoint(typeof(IHello), new BasicHttpBinding(),
address);
serviceHost.Open();
Console.WriteLine("Press <enter> to terminate service");
Console.ReadLine();
serviceHost.Close();
}
元数据终结点地址
• Windows Communication Foundation (WCF) 服务通过发
布一个或多个元数据终结点来发布元数据。
• 发布服务元数据之后,可以通过标准协议(如WSMetadataExchange
(MEX) 和 HTTP/GET 请求)来使用
该元数据。
• 元数据终结点类似于其他服务终结点:它们都有一个地
址、一个绑定和一个协定,并且它们都可通过配置或使用
代码添加到服务主机。
• 若要启用发布元数据终结点,必须将
ServiceMetadataBehavior 服务行为添加到该服务。默认
情况下,WCF 服务不发布元数据终结点,所以必须将它
们显式添加到服务才能为服务启用元数据发布。
mexHttpBinding(对于HTTP 发布)。
mexHttpsBinding(对于HTTPS 发布)
mexNamedPipeBinding(对于命名管道 p gmexTcpBinding(对于TCP 发布)。
<configuration>
<system.serviceModel>
<services>
<service
name="Metadata.Samples.SimpleService"
behaviorConfiguration="SimpleServiceBehavior">
<host>
<baseAddresses>
<add baseAddress="http://localhost:8001/MetadataSample"/>
</baseAddresses>
</host>
<endpoint address="" binding="wsHttpBinding" contract="Metadata.Samples.ISimpleService" />
<endpoint address="mex"
binding="mexHttpBinding"
contract="IMetadataExchange" />
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior name="SimpleServiceBehavior">
<serviceMetadata httpGetEnabled="True" policyVersion="Policy12" />
<serviceDebug includeExceptionDetailInFaults="False" />
</behavior>
</serviceBehaviors>
</behaviors>
</system.serviceModel>