WCF服务配置是WCF服务编程的主要部分。WCF作为分布式开发的基础框架,在定义服务以及定义消费服务的客户端时,都使用了配置文件的方法。虽然WCF也提供硬编程的方式,通过在代码中直接设置相关对象的属性来完成服务端与客户端的配置,然而这种方式并不利于后期程序的更改和扩展。因此,配置文件给WCF程序编程带来了极大的便利性,通过配置文件配置服务,可提供在部署时而非设计时提供终节点和服务行为数据的灵活性。正因如此,WCF的框架有着极大的伸缩性和自定义性。

WCF配置文件的结构如下图所示,包含3个部分,services(服务)、bindings(绑定)、behaviors(行为)

1.services节点

每个服务的发布都会包含有一个service节点,里面包含一个或者多个endpoint(终结点)。Service元素具有如下属性:

  • name:指定提供服务协定实现的类型,它是完全限定名称(命名空间和类型名称)
  • behaviorConfiguration:指定在behaviors元素中找到的服务行为元素的名称,对应的behaviors里面的节点为serviceBehaviors节点

endpoint指定用于公开服务的服务终结点的绑定、协定和地址属性。与WCF的所有通信是通过该服务的终结点进行的,利用终结点,WCF服务可以访问WCF提供的功能。常用属性如下:

  • address: 一个包含终结点地址的字符串,指定服务元素的统一标识符(URI)。 可以将地址指定为绝对地址或相对地址。 如果提供的是相对地址,则需要主机提供适合于绑定中所使用的传输方案的基址。 如果未配置地址,则假定基址为该终结点的地址。默认值为一个空字符串。
  • binding: 绑定指定如何与终结点进行通信,它可以是系统提供的绑定类型,如wsHttpBinding、WSDualHttpBinding、NetTcpBinding等,也可以是用户自定义绑定类型。指定的绑定确定传输协议的类型、安全和使用编码,以及是否支持或启用可靠会话、事务或流。
  • bindingConfiguration:一个字符串,指定实例化终结点时所使用的绑定的绑定名称。 定义终结点时,绑定名称必须在作用域内。如上图中采用的是wsHttpBinding,则bindingConfiguration的名称对应bindings下的wsHttpBinding里的名称为binding1的绑定。
  • behaviorConfiguration:指定在behaviors元素中找到的终结点行为元素的名称,对应的behaviors里面的节点为endpointBehaviors节点.
  • Contract:指示此终结点公开了哪个协定。 程序集必须实现该协定类型。 如果服务实现所实现的是单个协定类型,则可以省略此属性。 默认值为一个空字符串。

元数据终结点:WCF服务通过发布一个的或者多个元数据终结点来发布元数据。发布元数据后可以通过标准协议(如WS-MetadataExchange(MEX)和Http/Get请求)来使用该元数据。元数据终结点类似于其他服务终结点,他们     都需要第一个地址、一个协定、一个绑定。若要启用发布元数据终结点,必须将ServiceMetadataBehavior服务行为添加到该服务。默认情况下,WCF服务不发布元数据终结点,所以必须将他们显示的添加到服务配置中才能为     服务启用元数据发布。如下图所示:

Note: WCF元数据相关概念

WCF服务元数据是什么?

WCF服务元数据是WCF服务的核心部分服务地址(Address)、绑定(通信协议Binding)、契约(服务、操作、数据Contract)的原始描述信息。服务所公开的元数据包括 XSD(文档中出现的元素、文档中出现的属性、子元素、子元素的数量、子元素的顺序、元素是否为空、元素和属性的数据类型、元素或属性的默认和固定值)和 WSDL 文档(用于描述服务的方法、参数、参数个数、顺序、返回值、返回值的类型等方法的相关信息)。.Disco文档(描述服务的协议、地址、命名空间等信息)。

这些关键的WCF服务元数据全部都是基于XML语言描述,支持核心的行业标准协议。XSD好处显而易见,  基于XML,没有专门的语法 ,XML Schema支持一系列的数据类型(int、float、Boolean、date等) ,可扩充的数据模型,支持综合命名空间 ,支持属性组等。而这些正式WCF分布式服务追求的跨语言、跨平台的关键部分所在。

为什么要暴露服务元数据?

知道了WCF服务元数据的概念后,我们就能理解为什么要暴露服务的元数据。WCF服务的元数据描述服务的核心信息,客户端需要了解这些特征以便与该服务进行通信。要想实现异构平台或者系统之间的通信,以前的技术是使用Web Service.因为其具有自描述、可扩展、与平台无关等优势。客户端只需要根据Web Service地址,便可获取服务的相关信息,反序列话本地的代码,通过服务代理进行服务的调用。

WCF服务主要特性之一就是跨平台的服务交互。而暴露服务元数据的重要原因就是解决了异构客户端服务交互的关键问题。 元数据基于XML,自描述。客户端可以根据服务的元数据反序列换生成本地代码,无论是c#,vb还是java语。

2.bindings节点

配置绑定所需要的节点属性,绑定用于连接WCF服务终结点所需要的详细信息,所以每个终结点必须正确配置绑定信息,绑定最起码需要指定使用的传输机制(HTTP/TCP),还可以设置其他特征,如安全和事务支持。绑定信息可能很复杂,也可能很简单,一般来说绑定包含的如何连接到终结点的信息属于以下类别中的一种。

  • 协议:确定使用的安全机制,可靠消息传递或事务上下文流设置
  • 编码:确定消息编码(如文本或二进制)
  • 传输:确定使用的基础传输协议(如TCP/HTTP)

3.behaviors节点

包含serviceBehaviors(服务行为)、endpointBehaviors(终结点行为)的配置。

  • serviceBehaviors:包含的子元素如下:

  

  • endpointBehaviors:包含的子元素如下:

  

Note:具体参照MSDN

https://msdn.microsoft.com/zh-cn/library/aa967282(v=vs.110).aspx

https://msdn.microsoft.com/zh-cn/library/vstudio/ms731403(v=vs.100).aspx

接下来,我们照常写个实例,实例很简单,工程结构如右图所示:

using System.ServiceModel;

namespace Service
{
[ServiceContract]
public interface IReqReply
{
[OperationContract]
string SayHello(string name);
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; namespace Service
{
public class ReqReply:IReqReply
{
public string SayHello(string name)
{
return "Hello "+name;
}
}
}

Host工程的App.config配置文件如下:

<?xml version="1.0"?>
<configuration>
<system.serviceModel>
<services>
<service name="Service.ReqReply" behaviorConfiguration="ReqReplyBehavior">
<host>
<baseAddresses>
<add baseAddress="http://127.0.0.1:1234/ReqReply/"/>
</baseAddresses>
</host> <endpoint address="" binding="wsHttpBinding" contract="Service.IReqReply"
bindingConfiguration="binding1"
behaviorConfiguration="behavior1">
<identity>
<dns value="localhost" />
</identity>
</endpoint>
<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
</service>
</services> <bindings>
<wsHttpBinding>
<binding name="binding1">
<security mode="Message">
<message clientCredentialType="Windows"/>
</security>
</binding>
</wsHttpBinding>
</bindings> <behaviors>
<serviceBehaviors>
<behavior name="ReqReplyBehavior">
<serviceMetadata httpGetEnabled="True"/>
<serviceDebug includeExceptionDetailInFaults="True"/>
</behavior>
</serviceBehaviors> <endpointBehaviors>
<behavior name="behavior1">
<dataContractSerializer maxItemsInObjectGraph="2147483647"/>
</behavior>
</endpointBehaviors>
</behaviors>
</system.serviceModel> </configuration>

寄宿服务,Program.cs的代码如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ServiceModel;
using Service; namespace Host
{
class Program
{
static void Main(string[] args)
{
using (ServiceHost ReqReplyHost = new ServiceHost(typeof(ReqReply)))
{
ReqReplyHost.Opened += delegate
{
Console.WriteLine("请求响应通讯服务已经启动,按任意键终止!");
}; ReqReplyHost.Open();
Console.Read();
}
}
}
}

引用服务http://127.0.0.1:1234/ReqReply/,将服务命名为:ReqReplyServiceRef,客户端调用代码如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Client.ReqReplyServiceRef; namespace Client
{
class Program
{
static void Main(string[] args)
{
ReqReplyClient proxy = new ReqReplyClient();
Console.WriteLine(proxy.SayHello("WCF"));
Console.Read();
}
}
}                               

WCF初探-6:WCF服务配置的更多相关文章

  1. WCF的创建及其服务配置

    1 开发环境VS2010,我们可以通过,“WCF服务库”.“WCF服务应用程序”,这里说“WCF服务应用程序”的方式. 2 如下 ① ② 先把项目中的"IService1.cs", ...

  2. WCF初探-7:WCF服务配置工具使用

    在上一篇WCF服务配置中,文章讲解了WCF的配置所需要的基本节点和属性构造,但是对于初学者的我们在编写程序的时候,往往对这些节点的位置和属性不是特别清楚,所以就导致我们的因配置文件错误而不能运行服务程 ...

  3. WCF初探-9:WCF服务承载 (下)

    在WCF初探-8:WCF服务承载 (上)中,我们对宿主的概念.环境.特点做了文字性的介绍和概括,接下来我们将通过实例对这几种寄宿方式进行介绍.为了更好的说明各寄宿环境特点,本实例采用Http和net. ...

  4. WCF初探-10:WCF客户端调用服务

    创建WCF 服务客户端应用程序需要执行下列步骤: 获取服务终结点的服务协定.绑定以及地址信息 使用该信息创建 WCF 客户端 调用操作 关闭该 WCF 客户端对象 WCF客户端调用服务存在以下特点: ...

  5. WCF初探-13:WCF客户端为双工服务创建回调对象

    前言: 在WCF初探-5:WCF消息交换模式之双工通讯(Duplex)博文中,我讲解了双工通信服务的一个应用场景,即订阅和发布模式,这一篇,我将通过一个消息发送的例子讲解一下WCF客户端如何为双工服务 ...

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

    一.概述 我们在前面章节中讲了寄宿,在前面的实例中也用到了配置文件,这一篇主要讲讲如何在应用配置文件,提高WCF程序的灵活性.在编写WCF服务应用程序时,编写配置项也是其中一项主要工作,在前面的几个示 ...

  7. 【WCF全析(二)】--服务配置部署详解

            上篇文章主要讨论了WCF的基本内容,其中包括WCF的术语.创建方法及WCF在开发过程中使用的意义,它不仅能够提供程序之间的通信,而且还能提供程序和数据间的通信,WCF提供了多样化的程序 ...

  8. WCF服务配置编辑器使用

    学习wcf,特别是初学者,配置文件很难搞懂,有点复杂,自己手动配置哪有这么多精力啊,这不是吃的太饱了吗,所以学会使用配置编辑器是必须的,下面是学习的流程图. 打开工具的wcf服务配置编辑器,点击文件= ...

  9. WCF初探-11:WCF客户端异步调用服务

    前言: 在上一篇WCF初探-10:WCF客户端调用服务 中,我详细介绍了WCF客户端调用服务的方法,但是,这些操作都是同步进行的.有时我们需要长时间处理应用程序并得到返回结果,但又不想影响程序后面代码 ...

随机推荐

  1. 三大框架-Hibernate

    概念 持久化框架 把对象保存到数据库中,对数据的CURD操作 ORM框架 ORM对象关系映射 类<->表 属性<->字段 对象<->表中的记录 实现方法 创建持久化 ...

  2. 12个css高级技巧.html

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  3. C语言 在VS环境下一个很有意思的报错:stack around the variable was corrupted

    今天做一个很简单的oj来温习下c 语言 题目如下 输入 3位正整数 输出 逆置后的正整数 代码如下: #include"stdio.h"int main(){ float h,su ...

  4. 通过setDB2Client*来方便的使用TRACE调优jdbc程序

    一般来说通过TRACE的report来分析DDF的性能问题的话,基本对DBA都是噩梦一样.因为所有的Thread都是通过DDF一个类型的Thread,所以不管你怎么分类,看Accounting rep ...

  5. 最近在学习bootstrap的时候用bootstrap的视频教程2.0的引用bootstrap3.0突然发现很多不同,总结了一下

    bootstrap 2.3版与3.0版重要类的改变对比 Bootstrap 2.x Bootstrap 3.0 .container-fluid .container .row-fluid .row ...

  6. SQL标签

    SQL标签库提供了与关系型数据库进行交互的标签. 引入语法:<%@ taglib prefix="sql" uri="http://java.sun.com/jsp ...

  7. php 全角半角转换

    <?phpheader("Content-type: text/html; charset=utf-8");// 第一个参数:传入要转换的字符串// 第二个参数:取0,半角转 ...

  8. GnuPG 的PGP使用

    1. 生成秘钥对(此处采用默认的RSA, 2048位) $ gpg --gen-key gpg (GnuPG) ; Copyright (C) Free Software Foundation, In ...

  9. 备用帖子1Shell(Shell R语言)

    shell========================== echo 1 > /proc/sys/vm/drop_caches 清理内存 free -m du -h --max-depth= ...

  10. kvm -- Kernel-based Virtual Machine

    1.虚拟机类型: 类型1 硬件上直接安装hp  类型2 硬件上安装HOST 上面跑VMM 2.kvm概要 kvm 不算类型1也不算类型二.两种特性都有,他是linux的一个内核模块,内核中本身没有hv ...