复习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>

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

浙公网安备 33010602011771号