在WCF中,有一种叫做WCF排队调用的操作技术,可以帮助我们在程序开发中实现一些特定分功能。那么在这里,我们就会对此做一个详细的介绍,以方便大家在实际应用中能够获得一些帮助。#t#
Windows Communication Foundation 使用 NetMsmqBinding 来支持WCF排队调用。Windows Communication Foundation 在传输消息时不是通过 TCP 或 HTTP,而是通过 Microsoft® 消息队列 (MSMQ)。客户端也不是将 Windows Communication Foundation 消息发送到某个在线服务,而是发送到 MSMQ 队列。所有客户端所面向和交互的对象是队列,而非服务端点。因此,调用在本质上是异步的、是不连接的。直到服务在将来某一时刻处理消息时,这些调用才得以执行。
请注意,Windows Communication Foundation 消息并不直接映射到 MSMQ 消息。一个 MSMQ 消息可以包含一个或多个 Windows Communication Foundation 消息,具体个数视合约会话模式而定。对于必需会话模式,多个 Windows Communication Foundation 调用可共存于一个 MSMQ 消息中;而对于允许或不允许会话模式(由单调用和单例式服务使用),每个 Windows Communication Foundation 调用将位于单独的 MSMQ 消息中。
如同各 Windows Communication Foundation 服务一样,客户端会与代理进行交互,如图 1 所示。由于已将代理配置为使用 MSMQ 绑定,因而该代理不会向任何特定服务发送 Windows Communication Foundation 消息,而是将调用转换为 MSMQ 消息,然后将这些消息发布到端点地址所指定的队列中。
在服务端,当具有排队端点的服务主机启动后,主机会安装队列侦听程序。队列侦听程序会检测到队列中的消息并使其出队,然后创建主机端以调度程序为终点的侦听器链。调度程序会照例调用服务实例。如果客户端向队列发布了多个消息,侦听程序会随着消息的出队创建新的实例,最终以异步、非连接的并发调用结束。
如果主机处于离线状态,消息将在队列中保持待处理状态。待下次主机上线时,消息会被转发给服务。
面向队列进行的、可能处于非连接状态的调用不可能返回任何值,因为在将消息调度到队列时并未调用任何服务逻辑。此外,调用可能会在客户端应用程序停止运行后被调度给服务进行处理,而这时客户端根本无法处理返回的值。同样,调用也无法将任何服务端异常返回给客户端,而且也没有客户端用来捕获和处理异常。由于客户端不会因为调用操作而被封锁,更确切地说,客户端只有在将消息送去排队的片刻才才被封锁,因而从客户端的角度来看,WCF排队调用在本质上属于异步调用。这些是单向调用的典型特征。因此,由使用 NetMsmqBinding 的端点所提供的任何合约都只能具有单向操作。Windows Communication Foundation 会在加载服务和代理时对此进行验证:
- //只能对排队合约执行单向调用
- [ServiceContract]
- interface IMyContract
- {
- [OperationContract(IsOneWay = true)]
- void MyMethod();
- }
由于与 MSMQ 的交互封装在绑定中,因而在服务调用代码或客户端调用代码中没有任何与调用排队相关的内容。服务代码和客户端代码看起来与任何其他 Windows Communication Foundation 客户端代码和服务代码都是一样的,如图 2 所示。
针对排队服务定义端点时,端点地址中必须包含队列名称和队列类型(公有或私有):
- < endpoint
- address = "net.msmq://localhost/private/
- MyServiceQueue"
- binding = "netMsmqBinding"
- ...
- />
***,MSMQ 是 Windows Communication Foundation 的事务性资源管理器。如果队列是事务性的,则当客户端的事务中止时,客户端所发布的消息将会回滚。在服务端,从队列中读取消息时会启动新的事务。如果服务参与并中止该事务(可能因异常而导致),消息会回滚到队列中等待下一次重试。Windows Communication Foundation 提供了完善的故障检测和病毒消息处理支持功能。
以上就是我们为大家介绍的WCF排队调用的相关内容。