从整个基础架构的层次结构上将,WCF可以分为服务模型层(Service Model Layer)和信道层(Channel Layer)两个层次。服务模型层建立在信道层之上,提供了一个统一的。可扩展的编程模型;而信道层通过信道栈(Channel Stack)实现对消息的传输和处理。
信道层由绑定创建的信道栈组成,WCF在信道层之上建立服务模型层以提供一个面向对象的应用编程接口。
对于WCF的信道栈来说,也有两种必需的信道,即传输信道(Transport Channel)和消息编码信道(Message Encoding Channel)。
WCF采用基于消息的通信方式,所有功能,无论是与业务相关还是与业务无关的,都是通过消息交换来实现的。除了嘴基本的消息编码和传输之外,其他的一些功能也需要通过在消息交换工程中添加一些相应的消息处理操作来实现,典型的功能包括:
事务流转(Transaction Flowing):将从客户端开始的事务流转到服务端,从而将服务的执行纳入该事务。
安全传输(Transfer Security):保证数据包或消息的安全,避免被恶意篡改与窥伺,同时解决客户端和服务身份认证问题
可靠传输(Reliable Messaging):在网络环境稳定的情况下保证数据包或消息的可靠、有序传输。
对绝大部分WS-*协议的支持都是通过在信道栈中添加相应的信道实现的。如图3-2所示,在传输信道和消息编码信道之上,基于WS-Security的信道确保了消息的传输安全;基于WS-RM(WS-Reliable Message)的信道实现了消息的可靠传输;基于WS-AT(WS-Atomic Transaction)的信道实现了分布式的事物支持。
Receiver代码如下:
using System; using System.Collections.Generic; using System.Linq; using System.ServiceModel; using System.ServiceModel.Channels; using System.Text; using System.Threading.Tasks; using System.Xml.Linq; namespace Receiver { class Program { static void Main(string[] args) { Uri listeningUri = new Uri("http://127.0.0.1:3721/listener"); Binding binding = new BasicHttpBinding(); // 创建,开启监听器 IChannelListener<IReplyChannel> channelListener = binding.BuildChannelListener<IReplyChannel>(listeningUri); channelListener.Open(); // 创建,开启回复信道 IReplyChannel channel = channelListener.AcceptChannel(TimeSpan.MaxValue); channel.Open(); // 开始监听 while (true) { // 接收输入消息 RequestContext requestContext = channel.ReceiveRequest(TimeSpan.MaxValue); Console.WriteLine(requestContext.RequestMessage); // 消息回复 requestContext.Reply(CreateRelyMessage(binding)); } } static Message CreateRelyMessage(Binding binding) { string action = "http://www.artech.com/calculatorservice/AddResponse"; XNamespace ns = "http://www.artech.com"; XElement body = new XElement(new XElement(ns + "AddResult",3)); return Message.CreateMessage(binding.MessageVersion, action, body); } } }
Sender代码如下:
using System; using System.Collections.Generic; using System.Linq; using System.ServiceModel; using System.ServiceModel.Channels; using System.Text; using System.Threading.Tasks; using System.Xml.Linq; namespace Sender { class Program { static void Main(string[] args) { Uri listeningUri = new Uri("http://127.0.0.1:3721/listener"); Binding binding = new BasicHttpBinding(); // 创建,开启监听器 IChannelFactory<IRequestChannel> channelFactory = binding.BuildChannelFactory<IRequestChannel>(listeningUri); channelFactory.Open(); // 创建,开启回复信道 IRequestChannel channel = channelFactory.CreateChannel(new EndpointAddress(listeningUri)); channel.Open(); Message relyMessage = channel.Request(CreateRequestMessage(binding)); Console.WriteLine(relyMessage); Console.Read(); } static Message CreateRequestMessage(Binding binding) { string action = "http://www.artech.com/calculatorservice/Add"; XNamespace ns = "http://www.artech.com"; XElement body = new XElement(new XElement(ns + "Add", 3, new XElement(ns + "x", 1), new XElement(ns + "y", 2))); return Message.CreateMessage(binding.MessageVersion, action, body); } } }
Receiver
Sender
在整个绑定模型中,信道和信道栈位于最底层。信道栈是消息通信的通道,组成信道栈的各个信道专注于一个具体的消息处理功能的实现。按照提供的功能不同,可以将信道分成3类。
在WCF中,信道通过信道管理器(ChannelManager)创建。实际上,信道管理器就是信道监听器和信道工厂的统称。
由于它在客户端和服务端的作用不尽相同,信道管理器在服务端和客户端有不同的名称。服务端的信道管理器的作用在于创建信道栈监听和接受请求消息,所以称为信道监听器;而客户端的信道管理器在于创建信道进行请求消息的发送和回复消息的接受,所以被称为信道工厂。
WCF绑定模型涉及多种类型的组件,比如信道、信道监听器、信道工厂等。从功能上将,这些对象都是为通信服务的,可以把它们统称为通信对象。
默认超时时间
数据报模式(Datagram)
发送/遗忘(Send/Forget)或者单向(One-Way)模式
数据报模式一般采用异步的消息发送方式,并不希望收到对方的回复消息,在个别情况下甚至不关心消息能够正常地被接受。
请求-回复模式(Request-Reply)
请求-回复模式一般采用同步的通信模式(尽管改模式也可以用于异步通信)。
双工模式(Duplex)
如果采用双工消息交换模式,在进行消息交换过程中任何一方都可以向对方发送消息。双工通信使服务端回调客户端操作成为可能。
比较典型的双工模式是订阅/发布模式,该模式下的消息交换双方的角色从传统的发送方/接收方变成了订阅方和发布方。订阅方向发布方发送对某一主题的订阅请求,发布方接受到订阅消息后将订阅方添加到订阅列表之中。主题发布的时候,发布方提取当前主题的所有订阅方,对它们进行消息广播。
消息的交换依赖于网络传输,不同的网络传输协议对双工通信具有不同的支持方式。对于TCP来说,由于协议本身就是支持全双工的网络通信协议,所以能够提供双工通信原生的支持。但是对于Http协议来说,它本身就是简单的请求-回复的网络协议,是不支持双工通信的。基于WSDefalutHttpBinding的双工通信实际上是采用两个关联的Http通道实现的。
从状态保持的角度,可以把信道分为数据报信道(Datagram Channel)和回话信道(Sessionful Channel)。前者不需要保持具体的客户端(服务代理)的状态,因此多个客户端对象可以使用相同的信道;后者则绑定一个客户端对象,并且与客户端对象具有相同的生命周期。
WCF中的会话(Session)表示在进行通信的参与者之间共享的上下文,会话通过消息关联(Message Correlation)的方式来实现。所谓的消息关联,就是将发送自相同客户端消息通过一个会话ID关联在一起。
原文:http://www.cnblogs.com/tianxue/p/4658642.html