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>


参考

Wcf扩展

WCF Extensibility

WCF系列(1)—— CustomBehavior 入门

WCF进阶:扩展EndpointBehavior实现全局参数验证

通过WCF扩展实现消息压缩

如何通过扩展WCF来定制和扩展WCF行为

使用自定义行为扩展 WCF

扩展性

使用行为配置和扩展运行时

原文地址:https://www.cnblogs.com/beta2013/p/3377292.html