WCF笔记
注意
若使用不可序列化的数据类型(如在服务端定义object类型的类成员),可能会导致不响应的问题。
行为种类
契约行为、服务行为、操作行为、终结点行为
服务三要素
A:服务标识(即逻辑地址)。服务端使用相关的ListenUri(即物理地址)侦听来自客户端的数据,而客户端可通过配置ViaBehavior将数据路由至服务端
B:服务实现
C:服务能做的事
组件
信道分发器:消息监听与消息接收,并将接收到的消息发给相应的终结点分发器。侦听地址与信道分发器一一对应。服务端专用
信道侦听器:包含在信道分发器中,用于创建信息、监听消息。服务端专用
信道工厂:创建信道、发送消息。客户端专用
信息管理器:在客户端即为信道工厂;在服务端即为信道侦听器
终结点分发器:与终结点一一对应,使用内置的分发运行时最终完成对消息的处理
消息筛选器:包含在终结点分发器中,用于判断消息中的逻辑地址是否匹配,以确定是否将此消息交由此终结点进行处理
协议信道:负责维护消息的非业务逻辑功能,包括:事务、日志、可靠消息、安全性等。一个信道栈可以拥有任意多个协议信道。
编码信道:负责对消息的编码/解码。常见的编码/解码方式有Text/XML、Binary、MTOM
传输信道:负责基于某种传输协议的消息传输。一个信道栈只有一个传输信道
绑定:是一堆信道的有序集合。包括协议信道、编码信道、传输信道。其先后顺序维护在绑定上下文(Binding Context)中
安全
服务认证:客户端确认当前用的服务正是自己想调用的
客户端认证:服务端确认客户端的合法性
出错
服务端调用客户端的回调出错(调用时间超过IContextChanne.OperationTime时)时其回调实例不会进入出错状态。
但客户端若调用服务行为出错一次,其服务实例立即出错,并且无法再复用,只能重建。
日志
messageLogging:用于查看服务端与客户端交互的消息
endToEndTracing:使用此日志快速定位服务端或客户端内部发生异常的服务行为
日志配置示例
<system.diagnostics> <sources> <source name="System.ServiceModel.MessageLogging" switchValue="Warning"> <listeners> <add type="System.Diagnostics.DefaultTraceListener" name="Default"> <filter type="" /> </add> <add name="ServiceModelMessageLoggingListener"> <filter type="" /> </add> </listeners> </source> <source name="System.ServiceModel" switchValue="Warning" propagateActivity="true"> <listeners> <add type="System.Diagnostics.DefaultTraceListener" name="Default"> <filter type="" /> </add> <add name="ServiceModelTraceListener"> <filter type="" /> </add> </listeners> </source> </sources> <sharedListeners> <add initializeData="Log/messages.svclog" type="System.Diagnostics.XmlWriterTraceListener, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" name="ServiceModelMessageLoggingListener" traceOutputOptions="LogicalOperationStack, DateTime, Timestamp, ProcessId, ThreadId, Callstack"> <filter type="" /> </add> <add initializeData="Log/tracelog.svclog" type="System.Diagnostics.XmlWriterTraceListener, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" name="ServiceModelTraceListener" traceOutputOptions="LogicalOperationStack, DateTime, Timestamp, ProcessId, ThreadId, Callstack"> <filter type="" /> </add> </sharedListeners> <trace autoflush="true" /> </system.diagnostics> <system.serviceModel> <diagnostics performanceCounters="All"> <messageLogging logEntireMessage="false" logKnownPii="true" logMalformedMessages="true" logMessagesAtServiceLevel="true" logMessagesAtTransportLevel="false" maxMessagesToLog="1024000000" maxSizeOfMessageToLog="1024000"/> <endToEndTracing propagateActivity="true" activityTracing="true" messageFlowTracing="true" /> </diagnostics> </system.serviceModel>