勇哥注:
此系列文章是梳理一下勇哥认为项目有用的WCF的知识点,读者须有WCF的开发经验。
(一)wcf的概念和定位
1. 历史进程
面向对象:解决代码维护性问题【设计模式】
面向组件:解决利用性问题[react, html->一个个页面分成各个组件[es6 jsx, scss],让js成了一个面向对象的语言]
面向服务:解决多系统互通问题【跨平台,跨语言】否则写的系统 ,不能被别的系统调用。
2。 概念
SOA Service Oriented Architecture 面向服务架构
是一种思想
目前SOA还没有统一的定义,但是SOA具有系列的大家认可的特征,见贴子:
http://47.98.154.65/?id=2391
3。 目的
解决IT企业的信息孤岛的问题
一些历史遗留系统的互通问题
4。wcf在soa的定位
见图1.1
5。 实现途径
SebService标准:
WSDL:公布元数据
SOAP:简单对象访问协议[基于xml]
XSD:将各自系统的强类型转成XSD规范进行互通 [xml序列化用的]
例子:
.net System.String
xsd x:string
java Java.lang.String
一。三要素ABC
Address 地址,你家的地址在哪? (服务地址)
Binding 绑定,我该乘坐什么交通工具呢? (服务通讯 【http,tcp,msmq,udp】)
Contract 契约,去你 家做什么? (服务边界)
wcf的发展历程和在soa中的定位,如下图:
(图1.1)
客户如何访问服务端,如下图所示:
1。服务端对外公开提供endPoint,endPoint包括ABC三要素,即地址、绑定、契约
2。客户端通过代理proxy,通过ABC,来访问服务端。
3。注意双向箭头,表示双方可以互相通信。
二. wcf的配置文件
根结点: system.serviceModel
service 对外的endpoint进行配置
bindings 对所有的B进行配置(打开时间,关闭时间,传输时间。。。)
behaviors 对影响wcf运行时的一些方法进行配置(服务线程数,服务实例,事务等)
<baseAddress> 基地址
<endpoint address=""> 如果为空,则会使用baseAddress
endpoint address= BaseAddress+endpoint address 也就是说可以组合在一起用
<behaiviors>
<serviceBehaviors>
<behavior>
<!-- 为避免泄露元数据信息,请在部署前将以下设置为false --!>
<serviceMetadata httpGetEnabled="true" httpGetEnabled="true">
<serviceDebug includeExceptionDetailInFaults="false">
配置文件的优缺点:
1。 只修改配置,不用改程序
2。 wcf集群增加到多台的时候,不能集中设置
解决方案是:
1。 能写入代码的配置(固定不变的)就写入代码
2。config中心化
有zookeeper, apollo [https://github.com/ctripcorp/apollo/wiki/Quick-Start] 国产开源
三. wcf的架构组成
服务运行时:
限制行为,错误行为,元数据行为,
实例行为 (app.config中的behaiviors配置的就是实例行为)
参数筛选
协定:
数据协定 (对xsd的操作)
消息协定 (对message的协定)
服务协定 (对契约的特性 ServiceContract)
策略与绑定
四. wcf程序的运行原理示意图:
binding对象是一个协议栈
每一种binding对象的协议栈数量是不同的。
下图是在监视窗口中查看的NetTcpBinding和BasicHttpBinding的协议栈:
对于NetTcpBinding:
底层transport是 tcp传输
security是 支持的
Encoding是 二进制方式
上层Transaction是 事务流
(五)端口共享
端口共享在wcf中的意义?
由于防火墙一般只开放少数端口以防止网络攻击。所以必须使用端口共享。
对于Internet和本地网的通讯,防火墙一般只保留80|443端口,以保证http和https。
通过iis寄宿方式则可以实现端口的共享,但是仅限于寄宿iis,如果是自我寄宿的方式,80|443是不可用的。
对于tcp,通过Net.TCP Port Sharing Service,可以实现端口共享。
见《WCF技术剖析》第2章 2.2端口共享
(六)服务契约,操作契约
[ServiceContract,OperationContract]
使用: 用于定义服务边界,也就是定制wsdl。
wsdl可以找到的东西:
1. 服务地址 soap:address
.net中由svcutil 来解析
2. 传输协议 soap.binding [http://schemas.xmlsoap.org/soap/http(tcp)]
3. 绑定类型 BasicHttpBinding
4. Operation和message的对应关系 (一对一,一对二)
契约的三种模式:
1. rpc模式 (input, output)
请求响应,默认的模式。
对应关系:
从wsdl中可以看到,一个operation对应着两条message的action
<wsdl:operation name="DoWork">
<wsdl:input message=tns:IHomeService_DoWork_InputMessage" wsaw:Action=“”>
2. 单向模式(isOneWay [在线(online)与离线(offline)])
场景:不需要service响应,适合不需要等待结果的业务场景。
fiddler监控: HTTP/1.1 202 Accepted, 了解http 202状态码
3. 双向通讯[发布订阅]
契约的特性的参数:
1. 修改ServiceContract的Name和Namespace
2. 修改OperationContract的Name和ReplyAction

