DotNet关键知识点——WCF篇(四)
WCF的配置
1. 客户端声明式配置
端点定义在标签对内,也以ABC为要素,可含name用以命名。Contract根据指向导出的代理(接口)。
端点头信息
在中定义标签对,可含请求的优先级信息标签。
定义端点的元数据
metadata,含policyImporters和wsdlImporters。
端点属性设置
类似服务器侧,在endpoint标签中指定属性bindingConfiguration="配置式名称",在标签对中加入对应的具体的binding标签(如basicHttpBinding,wsHttpBinding等),在该标签中加入binding标签,其名称属性name即上述配置式名称。
端点行为设置
端点行为配置本质上是对端点属性的一种集合式设置以达到某个功能。类似服务器侧,在endpoint标签中指定属性behaviorConfiguration="配置式名称",在标签对中加入标签对,在其中加入标签对,其名称属性name即上述配置式名称,在该组标签对中包含一系列的行为配置元素:
元素 | 说明 | 子元素和属性 |
clientCredentials | 鉴权保密信息 | 子元素: clientCertificate:客户证书 httpDigest:摘要访问(Digest Access)验证类型 issuedToken:送到service进行验证的令牌属性 peer:在P2P模式下的验证 serviceCertificate:从service得到证书并送到service以进行验证 windows:含属性 allowedImpersonation, allowNtlm |
callbackDebug | 控制回调异常的传导 类似服务端的serviceDebug |
仅有属性includExceptionDetailsInFaults设为True表示回调(如双工)所有异常均传回到服务,存在安全隐患 |
callbackTimeouts | 设置回调超时 | 仅有属性TimeSpan transactionTimeout属性用以设置 |
clientVia | 调试中继站 | 属性viaUri设置到中继站的URI |
dataContractSerializer | 控制创建请求和解析响应的序列化过程 | 属性MaxItemsInObjectGraph规定序列化过程中序列化树中最大元素个数;IgnoreExtensionDataObject在DataContract数据类型也实现IExtensibleDataObject时,支持序列化的前向兼容。 |
synchronousReceive | 为受到的每个请求消息设置独立的处理线程 | |
transactedBatching | 设置一个事务中回传的回调 | 仅有属性maxBatchSize设置最大的回调个数 |
2. 客户端命令式配置
AddressHeader header = AddressHeader.CreateAddressHeader("header名", "名空间", object 值);
EndpointAddress endpoint = new EndpointAddress(客户端只能是绝对地址, header);
SomeBinding binding = new SomeBinding("binding配置式名称");
// 或使用安全模式设置:
SomeBinding binding = new SomeBinding(SecuritMode.xxx);
SomeProxy proxy = new SomeProxy(binding, endpoint); // 参数设置binding和address,proxy内含contract
// 或使用name命名的声明配置的endpoint:
SomeProxy proxy = new SomeProxy("endpoint的配置式名称");
3. 服务端命令式配置
在第二篇中已经介绍部分基本的服务器命令式配置。这里补充:
多端点
binding和端点地址是1对1关系,即同一个地址,不为之再创建一个binding,即使配置完全相同。
监听URI共享
使用AddServiceEndpoint(C,B,A, Uri commonUri)版本,第四个参数设置监听URI,即客户端设置的viaUri,
这样,在客户端proxy常规创建完后添加以下端点行为以建立到中继的转接:
proxy.Endpoint.Behaviors.Add(new ViaUriBehavior(commonUri));
Binding的创建
在第二篇中已提及,Binding的本质是一系列的BindingElement,以下对常用BindingElement做一总结:
元素(XXXBindingElement) | 说明 | 属性 |
TextMessageEncoding | 编码基于文本的SOAP消息 | MaxReadPoolSize:处理请求的读取器(reader)的个数 MaxWritePoolSize:处理输出请求的读取器个数 MessageVersion:SOAP和WS-Addressing版本 ReaderQuotas: 消息中字符串内容限制 WriteEncoding:编码格式 |
HttpTransport | HTTP协议传输支持 | AllowCookies:客户端是否使用Cookie AuthenticationScheme:服务访问认证方式 BypassProxyOnLocal:局域服务不用代理 HostNameComparisonMode:依优先级为强主机忽略、全等和弱主机忽略的URI匹配 KeepAliveEnabled:不间断连接 ProxyAddress:代理地址 ProxyAuthenticationScheme:代理认证方式 Realm:鉴权分区(RFC2617) TransferMode:缓冲|流式(一或两端)模式 UnsafeConnectionNtlmAuthentication: UseDefaultWebProxy:是否用系统代理 |
HttpsTransport | 从HttpTransportBindingElement继承,在启用安全时替代之 | 继承HttpTransport外: RequireClientCertificate:SSL客户端认证 Scheme:设为https |
BinaryMessageEncoding | 将消息转换为二进制格式 | |
TransactionFlow | 事务流机制 | 仅有TransactionProtocol,表示如何从C到S传送事务,默认OleTransaction,也可支持WS-Atomic |
TcpTransport | ChannelInitializationTimeout:初始化超时 ConnectionBufferSize:传出消息缓冲长度 ConnectionPoolSettings:连接池设置 ListenBacklog:(socket层)最大监听个数 PortSharingEnabled:端口(进程间)共享 TeredoEnabled:一种翻越防火墙的技术 TransferMode:同前 |
|
NamedPipeTransport | 命名管道的传输机制 | ChannelInitializationTimeout: 同上 ConnectionBufferSize: 同上 ConnectionPoolSettings: 同上 TransferMode:同上 |
MsmqTransport | MSMQ传输机制 | CustomDeadLetterQueue:队列的URI DeadLetterQueue:包括不用,系统和自定义 Durable:队列管理器失败时消息是否会丢失 ExactlyOnce:只传一次,必须为Durable MaxRetryCycles:最大尝试次数 MsmqTransportSecurity:传输层安全性 QueueTransferProtocol:包括本地MSMQ协议,SOAP可靠消息协议(SRMP),SRMP安全协议,当开启AD DS,只能使用本地协议 ReceiveErrorHandling: 如何处置问题消息,包括丢弃,回传错误到客户,通过否定ACK拒绝消息,或将消息放入有毒消息队列 ReceiveRetryCount:入重试队列前尝试次数 RetryCycleDelay:一次重试尝试的时间 TimeToLive:消息超时后置入dead-letter队列 TransactedReceiveEnabled:是否消息接受作为事务一部分 UseActiveDirectory:是否队列地址转换为活动目录的域服务(AD DS) UseMsmqTracing:是否用MSMQ内建跟踪器 UseSourceJournal:是否在源日志中保留消息副本 |
PnrpPeerResolver | Peer Name Resolution Protocol实现,用于P2P链接 | 仅有ReferralPolicy,用于设置Referral是否与其他resolver共享 |
PeerTransport | P2P传输机制 | ListenIPAddress:监听的IP地址 Port: 监听的端口 Security: 安全性设置 |
CompositeDuplex | 基于HTTP的双工通信,支持回调 | 仅有ClientBaseAddress,回调消息的目的地址 |
ReliableSession | 消息有序化 | AcknowledgementInterval:服务端ACK消息编组发回的时间间隔 EnableFlowControl:是否开启服务端流量控制 InactivityTimeout:无消息时服务保持的时长 MaxPendingChannels:最大的等待通道数 MaxRetryCount:最大重试次数 MaxTransferWindowSize:在收发缓冲中最大消息个数 Ordered:是否保证有序化 |
上述BindingElement的继承关系(~表示BindingElement)
~ – Transport~ – HttpTransport~ - HttpsTransport~
–ConnectionOrientedTransport~ – TcpTransport~
- NamedPipeTransport~
- Msmq~Base - MsmqTransport~
- PeerResolver~ - PnrpPeerResolver~
- PeerTransport~
- MessageEncoding~ – TextMessageEncoding~
– BinaryMessageEncoding~
- TransactionFlow~
- CompositeDuplexBindingElement~
- ReliableSession~
主要的Binding类型
Binding类型 | 说明 | 使用的BindingElement |
basicHttpBinding | TextMessageEncoding; Http(s)Transport |
|
netTcpBinding | BinaryMessageEncoding; TransactionFlow; TcpTransport |
|
netNamedPipeBinding | BinaryMessageEncoding; TransactionFlow; NamedPipeTransport |
|
netMsmqBinding | 不支持事务流 | BinaryMessageEncoding; MsmqTransport |
netPeerTcpBinding | BinaryMessageEncoding; PnrpPeerResolver; PeerTransport |
|
wsDualHttpBinding | TextMessageEncoding; TransactionFlow; HttpTransport CompositeDuplex; ReliableSession |
其他常用Binding类型
Binding类型 | 说明 | 使用的BindingElement |
basicHttpContextBinding | allowCookies=True | TextMessageEncoding; HttpTransport |
msmqIntegrationBinding | BinaryMessageEncoding; MsmqTransport |
|
netTcpContextBinding | BinaryMessageEncoding; TransactionFlow; TcpTransport |
|
webHttpBinding | 与basicHttpBinding主要区别是消息格式 | TextMessageEncoding; HttpTransport |
wsFederationHttpbinding | TextMessageEncoding; TransactionFlow; HttpTransport |
|
wsHttpContextBinding | 同上 | |
ws2007FederationHttpBinding | 同上 | |
ws2007HttpBinding | 同上 |
4. WCF流水线
客户端应用程序 –> 服务代理(Proxy) –> 通道 –> 通道 … –> 传输通道 –> … 通道 –> 通道 –> 分发器 –> 服务端