WCF学习之旅—WCF服务配置(十四)
一、概述
我们在前面章节中讲了寄宿,在前面的实例中也用到了配置文件,这一篇主要讲讲如何在应用配置文件,提高WCF程序的灵活性。在编写WCF服务应用程序时,编写配置项也是其中一项主要工作,在前面的几个示例中我也使用过配置文件,通过配置文件来简化代码。WCF通过公开终结点,向客户端公开服务,包括服务的地址、服务用于发送和接收消息的传输和消息编码,以及服务需要的安全类型等。当我们把这些配置项写入到配置文件后,我们无需编译即可修改WCF的一些可变信息,提高了程序的灵活性。
注意:
1)在代码里写了配置,那么配置文件中的配置项将不起作用。
2) Web程序在Web.config中配置,应用程序中在App.config中配置。
WCF能够建立一个跨平台的安全、可信赖、事务性的解决方案,是一个WebService,.Net Remoting,Enterprise Service,WSE,MSMQ的并集,有一副很经典的对比图如下:

WCF与其他分布式技术对比表
二、WCF中的 "A","B","C" 介绍
我们先看个生活中的例子,某一天,O2O公司接到一份上门美甲服务订单,美甲师上门服务的过程可以选择的交通方式为“电动车”、“公交”、“地铁”,到了客户的家里,你要找到客户,服务完成之后,需要一份客户的服务评价和付款确认。
要完成这项工作任务我们执行以下几个主要的步骤:
(1)我们首先要知道客户所在的地址,引出WCF中的"A"。
A(Address):英文理解为"地址",在计算机中是通过一个URI唯一地址标识,通过这个地址我们可以找到我们要调用的WCF服务。
(2)美甲师还要选择相应的交通方式,每种交通方式达到的结果不一样。如:电动车需要自备车辆,时间上视道路情况而定。公交最便宜,并且可选择多条线路,时间可控性差。地铁最方便,但是偶尔会很挤,一般都没座等等,引出WCF中的"B"。
B(Binding):英文理解为"捆绑,绑定", Binding实现在 客户端和服务端通信的所有底层细节。比如客户端与服务端之间传递的Message是如何编码的—— text/XML, binary,MTOM;这种Message的传递是采用的哪种Transport——TCP, Http, Named Pipe, MSMQ; 以及采用怎样的机制解决Secure Messaging的问题——SSL,Message Level Security。
(3)到了客户家里之后我们能做哪些事?I.给客户美甲,II.拿服务评价与付款确认。我们不能要求客户给其他的东西,引出WCF中的"C"。
C(Contract):英文理解为"合同",合同是什么?告诉我们哪些事能做,如些事不能做。 Contract的主要的作用是暴露某个WCF Service所提供的所有有效的方法。Contract实际上是把每个方法的转化成为相对应的消息。从Message Exchange的层面上讲,Contract实际上是抱每个操作转化成为相对应的Message Exchange Pattern——MEP(Request/Response; One-way; Duplex)
4) Behavior: Behavior的主要作用是定制Endpoint在运行时的一些必要的Behavior。比如服务端回调客户端时超时了;客户端采用的Credential type;以及是否支持Transaction等。
三、Endpoint(终结点)
WCF实现了网络系统的各个应用程序的通信。各个应用程序的通信是以“终结点(Endpoint)”的来实现的。我们在上面讲的实际例子中的A、B、C即是Endpoint 的组成部分,他是服务器间通信调用的入口。

四、应用程序间通信
我们在第二和第三项中讲了A、B、C与Endpoint,现在正式进入应用程序间的通信。我们还是以刚才上门美甲的过程为例:

美甲师手里有一张订单,标记着:地址、绑定、合同.....而客户手里也有一张订单,标记着同样的内容,并且一直得在等待美甲师的出现。只有当订单上的内容一样时,美甲师才会替客户服务,客户在服务完成之后会进行服务评价与付款确认。
当我们寄宿WCF服务的时候,我们必须定义一个或是多个终结点,然后 服务端通过监听这些终结点来处理客户端发来的请求。由于应用程序之间是靠Endpoint来通信,那么我们在客户端也必须定义终 结点,只有当客户端与服务端的终结点完全匹配的时候才能进行通信。

如上图所示:只有EndpointA中的A、B、C与EndPointB中的A、B、C完全匹配时才能通信。EndPointE与EndpointD也是一样的。
五、实例
1)服务配置的主要部分
在.config中配置文件中的configuration节点下面有:<system.serviceModel></system.serviceModel>节点,在这个节点中主要有三个平级的部分。如下代码所示:
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<system.serviceModel>
<!--配置服务和终结点开始-->
<services>
<service>
<endpoint></endpoint>
</service>
</services>
<!--配置服务和终结点结束-->
<!--配置绑定开始-->
<bindings>
<netTcpBinding>
<binding>
</binding>
</netTcpBinding>
</bindings>
<!--配置绑定结束-->
<!--配置行为开始-->
<behaviors>
<serviceBehaviors>
<behavior>
</behavior>
</serviceBehaviors>
</behaviors>
<!--配置行为结束-->
</system.serviceModel>
</configuration>
Service配置节[必须有]:配置服务、接口和终结点。每个Service都会有以下两个属性。name:名称空间.类名[服务的具体实现类]。behaviorConfiguration:一个在behaviors节点中找到的名称。
Binding配置节[可有可无]:配置绑定,如http,tcp等。
Behavior配置节[可有可无]:配置行为,如认证等。
2)实例
<?xml version="1.0"?>
<configuration>
<system.web>
<compilation debug="true"/>
</system.web>
<!-- When deploying the service library project, the content of the config file must be added to the host's app.config file. System.Configuration does not support config files for libraries. -->
<system.serviceModel>
<protocolMapping>
<add scheme="http" binding="basicHttpBinding"/>
<add scheme="net.tcp" binding="netTcpBinding"/>
<add scheme="net.pipe" binding="netNamedPipeBinding"/>
<add scheme="net.msmq" binding="netMsmqBinding"/> </protocolMapping>
<!--服务-->
<services> <!--name:名称空间.类型名-->
<!--behaviorConfiguration:behavior的名称,请看behavior配置节的名称--> <service behaviorConfiguration="simpleBehavior" name="WCFService.WCFService" > <!-- 除非完全限定,否则地址将与上面提供的基址相关,每个服务可以有多个Endpoint -->
<!-- Address:指定这个Endpoint对外的URI,这个URI可以是个绝对地址,也可以是个相对于baseAddress的 相对地址。如果此属性为空,则这个Endpoint的地址就是baseAddress--> <!--bindingConfiguration:binding的名称,请看binding配置节的名称-->
<endpoint name="endpointService"
address="http://localhost:8000/WCFService"
binding="basicHttpBinding"
contract="WCFService.IWCFService"> </endpoint>
<!-- 此终结点不使用安全绑定,应在部署前确保其安全或将其删除--> <!--<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />--> <host>
<!-- 每种传输协议的baseAddress,用于跟使用同样传输协议Endpoint定义的相对地址组成完整的地址, 每种传输协议只能定义一个baseAddress。HTTP的baseAddress同时是service对外发布服务说明页面的URL --> <!-- <baseAddresses>
<add baseAddress="http://localhost:8000/"/>
</baseAddresses>-->
</host>
</service>
</services>
<!--行为--> <behaviors> <serviceBehaviors >
<!-- httpGetEnabled - bool类型的值,表示是否允许通过HTTP的get方法获取sevice的WSDL元数据 --> <behavior name="simpleBehavior"> <serviceMetadata httpGetEnabled="true" httpGetUrl="http://localhost:8000/WCFService/metadata" />
<serviceDebug includeExceptionDetailInFaults="false"/> </behavior>
</serviceBehaviors>
</behaviors>
<!--绑定--> <bindings> <basicHttpBinding></basicHttpBinding>
<basicHttpContextBinding></basicHttpContextBinding> <netMsmqBinding></netMsmqBinding>
<netNamedPipeBinding></netNamedPipeBinding>
<webHttpBinding></webHttpBinding> <wsHttpBinding>
<binding >
<security mode="Transport">
<transport clientCredentialType="None">
</transport>
<message clientCredentialType="Certificate"/> </security>
</binding>
</wsHttpBinding>
<wsDualHttpBinding></wsDualHttpBinding>
</bindings> </system.serviceModel> <startup> <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/> </startup> </configuration>
结果如下图:

WCF学习之旅—WCF服务配置(十四)的更多相关文章
- WCF学习之旅—WCF服务的WAS寄宿(十二)
上接 WCF学习之旅—WCF服务部署到IIS7.5(九) WCF学习之旅—WCF服务部署到应用程序(十) WCF学习之旅—WCF服务的Windows 服务程序寄宿(十一) 八.WAS宿主 IIS ...
- WCF学习之旅—WCF服务部署到应用程序(十)
上接 WCF学习之旅—WCF寄宿前的准备(八) WCF学习之旅—WCF服务部署到IIS7.5(九) 五.控制台应用程序宿主 (1) 在解决方案下新建控制台输出项目 ConsoleHosting.如下 ...
- WCF学习之旅—WCF服务的Windows 服务程序寄宿(十一)
上接 WCF学习之旅—WCF服务部署到IIS7.5(九) WCF学习之旅—WCF服务部署到应用程序(十) 七 WCF服务的Windows 服务程序寄宿 这种方式的服务寄宿,和IIS一样有一个一样 ...
- WCF学习之旅—WCF服务的批量寄宿(十三)
上接 WCF学习之旅—WCF服务部署到IIS7.5(九) WCF学习之旅—WCF服务部署到应用程序(十) WCF学习之旅—WCF服务的Windows 服务程序寄宿(十一) WCF学习之旅—WCF ...
- WCF学习之旅—WCF服务部署到IIS7.5(九)
上接 WCF学习之旅—WCF寄宿前的准备(八) 四.WCF服务部署到IIS7.5 我们把WCF寄宿在IIS之上,在IIS中宿主一个服务的主要优点是在发生客户端请求时宿主进程会被自动启动,并且你可以 ...
- WCF学习之旅—WCF第二个示例(五)
二.WCF服务端应用程序 第一步,创建WCF服务应用程序项目 打开Visual Studio 2015,在菜单上点击文件—>新建—>项目—>WCF服务应用程序.在弹出界面的“名称”对 ...
- WCF学习之旅—WCF第二个示例(七)
三.创建客户端应用程序 若要创建客户端应用程序,你将另外添加一个项目,添加对该项目的服务引用,配置数据源,并创建一个用户界面以显示服务中的数据. 在第一个步骤中,你将 Windows 窗体项目添加到解 ...
- WCF学习之旅—WCF第二个示例(六)
第五步,创建数据服务 在“解决方案资源管理器”中,使用鼠标左键选中“SCF.WcfService”项目,然后在菜单栏上,依次选择“项目”.“添加新项”. 在“添加新项”对话框中,选择“Web”节点,然 ...
- WCF学习之旅—WCF概述(四)
一.WCF概述 1) 什么是WCF? Windows Communication Foundation (WCF) 是用于构建面向服务的应用程序的框架.借助 WCF,可以将数据作为异步消息从一个服务终 ...
随机推荐
- JS正则表达式常用总结
正则表达式的创建 JS正则表达式的创建有两种方式: new RegExp() 和 直接字面量. //使用RegExp对象创建 var regObj = new RegExp("(^\\s+) ...
- iOS可视化动态绘制八种排序过程
前面几篇博客都是关于排序的,在之前陆陆续续发布的博客中,我们先后介绍了冒泡排序.选择排序.插入排序.希尔排序.堆排序.归并排序以及快速排序.俗话说的好,做事儿要善始善终,本篇博客就算是对之前那几篇博客 ...
- ASP.NET MVC5+EF6+EasyUI 后台管理系统(67)-MVC与ECharts
系列目录 ECharts 特性介绍 ECharts,一个纯 Javascript 的图表库,可以流畅的运行在 PC 和移动设备上,兼容当前绝大部分浏览器(IE8/9/10/11,Chrome,Fire ...
- .NET Core采用的全新配置系统[9]: 为什么针对XML的支持不够好?如何改进?
物理文件是我们最常用到的原始配置的载体,最佳的配置文件格式主要由三种,它们分别是JSON.XML和INI,对应的配置源类型分别是JsonConfigurationSource.XmlConfigura ...
- python之最强王者(9)——函数
1.Python 函数 函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段. 函数能提高应用的模块性,和代码的重复利用率.你已经知道Python提供了许多内建函数,比如print().但 ...
- OpenDigg前端开源项目周报1219
由OpenDigg 出品的前端开源项目周报第二期来啦.我们的前端开源周报集合了OpenDigg一周来新收录的优质的前端开发方面的开源项目,方便前端开发人员便捷的找到自己需要的项目工具等.react-f ...
- Android之DOM解析XML
一.DOM解析方法介绍 DOM是基于树形结构的节点或信息片段的集合,允许开发人员使用DOM API遍历XML树,检索所需数据.分析该结构通常需要加载整个文档和构造树形结构,然后才可以检索和更新节点信息 ...
- Winserver2012下mysql 5.7解压版(zip)配置安装
一.安装 下载mysqlzip版本mysql不需要运行可执行文件,解压即可,下载zip版本mysqlmsi版本mysql双击文件即可安装,相对简单,本文不介绍此版本安装 配置环境变量打开环境变量配置页 ...
- Linux基础介绍【第四篇】
Linux文件和目录的属性及权限 命令: [root@oldboy ~]# ls -lhi total 40K 24973 -rw-------. 1 root root 1.1K Dec 10 16 ...
- 一步步开发自己的博客 .NET版 剧终篇(6、响应式布局 和 自定义样式)
前言 这次开发的博客主要功能或特点: 第一:可以兼容各终端,特别是手机端. 第二:到时会用到大量html5,炫啊. 第三:导入博客园的精华文章,并做分类.(不要封我) 第四:做 ...