MSMQ使用WCF正确实现技巧讲解
创始人
2024-06-23 13:20:33
0

在了解了WCF之后,大家应该会被他强大的功能,突出的优势所深深吸引。它能够为我们轻松的打造一个跨平台的安全性极强的解决方案。在这里我们会为大家介绍一下MSMQ使用WCF的实现方法。#t#

在windows平台上,MSMQ是***的消息传递中间件,它是一种高速、异步、可靠的通信机制,当我们在Internet上的两个应用需要交换信息时,使用这样的中间件可能是必须的。

WCF完全面向SOA,大大简化了以往风格迥异的多种分布式解决方案。刚好,最近的一个项目需要使用SOA架构,而底层需要使用MSMQ作为消息传递基础设施,所以这两天研究了一下,MSMQ使用WCF的方法。下面以一个例子说明。

首先定义服务端和客户端赖以沟通的Contract,通常将这些Contact定义在一个单独的dll中,如此可被服务端和客户端引用。我们假设一个简单的Contract,即一个接口ICalculate:

  1. [ServiceContract]   
  2. [ServiceContract]   
  3. public interface ICalculate   
  4. {   
  5. [OperationContract(IsOneWay=true)]   
  6. void DealOrder(string orderID);   

 

例子中,我们将ICalculate定义在WcfLib.dll中。

服务端需要实现ICalculate接口:

 

  1. public class Calculator : ICalculate   
  2. {   
  3. public void DealOrder(string orderID)   
  4. {   
  5. Program.FileLogger.Log(orderID);   
  6. }   

 

接下来,服务端就可以以MSMQ的方式发布该服务了,这个可以在配置文件App.Config中进行配置:

 

  1. < ?xml version="1.0" encoding="utf-8" ?>   
  2. < configuration>   
  3. < system.serviceModel>   
  4. < services>   
  5. < service name="WcfTest.Calculator">   
  6. < endpoint address="net.msmq://localhost/private/WcfTest"   
  7. binding="netMsmqBinding" bindingConfiguration="msmq"   
  8. contract="WcfLib.ICalculate"/>   
  9. < /service>   
  10. < /services> < bindings>   
  11. < netMsmqBinding>   
  12. < binding name="msmq">   
  13. < security mode ="None"/>   
  14. < /binding>   
  15. < /netMsmqBinding>   
  16. < /bindings>   
  17. < /system.serviceModel>   
  18. < /configuration>  

 

配置中红色部分标志了WCF的“ABC”,address表明了将使用本地的名为WcfTest的专用队列。请注意,binding配置后有一个bindingConfiguration,说明这个binding需要更高级的配置,相应的配置段在bindings Segment中,由于示例中使用的消息队列没有使用域模式,所以security mode 设为None,该配置会将MsmqAuthenticationMode属性设置为MsmqAuthenticationMode.None。另外,配置中显示的WcfTest专用队列需要被设置为“事务性”,在创建队列的时候可以选择此属性。

配置完成后,我们可以启动MSMQ使用WCF的服务了:

 

  1. ServiceHost serviceHost = new ServiceHost(typeof(Calculator));   
  2. serviceHost.Open();  

 

再来看客户端,非常简单,首先在App.Config中设置“ABC”(与服务端一致):

 

  1. < ?xml version="1.0" encoding="utf-8" ?>   
  2. < configuration>   
  3. < system.serviceModel>   
  4. < client>   
  5. < endpoint name="CalculatorClient"   
  6. address="net.msmq://localhost/private/WcfTest"   
  7. binding="netMsmqBinding" bindingConfiguration="msmq"   
  8. contract="WcfLib.ICalculate">   
  9. < /endpoint>   
  10. < /client>   
  11. < bindings>   
  12. < netMsmqBinding>   
  13. < binding name="msmq">   
  14. < security mode ="None"/>   
  15. < /binding>   
  16. < /netMsmqBinding>   
  17. < /bindings>   
  18. < /system.serviceModel>   
  19. < /configuration>  

 

在添加了对WcfLib.dll的引用后,接下来就可以调用服务了:

 

  1. ChannelFactory< WcfLib.ICalculate> channelFactory =
     new ChannelFactory< ICalculate>("CalculatorClient");   
  2. ICalculate calculate = channelFactory.CreateChannel();   
  3. calculate.DealOrder(this.textBox1.Text);  

 

MSMQ使用WCF作为消息传递基础设施后,有这样一个好处,当Internet不可用或者服务端没有启动时,客户端仍然可以调用DealOrder方法将消息发送,当然,消息会暂存在队列中,等网络恢复或服务端启动后,这些队列中的消息将会被处理。

相关内容

热门资讯

PHP新手之PHP入门 PHP是一种易于学习和使用的服务器端脚本语言。只需要很少的编程知识你就能使用PHP建立一个真正交互的...
网络中立的未来 网络中立性是什... 《牛津词典》中对“网络中立”的解释是“电信运营商应秉持的一种原则,即不考虑来源地提供所有内容和应用的...
各种千兆交换机的数据接口类型详... 千兆交换机有很多值得学习的地方,这里我们主要介绍各种千兆交换机的数据接口类型,作为局域网的主要连接设...
粉嫩如何诠释霸道 东芝M805... “霸道粉”是个什么玩意东芝M805拿过来的时候,笔者扑哧笑了,不是笑这款笔记本,而是笑这款产品的颜色...
什么是大数据安全 什么是大数据... 在《为什么需要大数据安全分析》一文中,我们已经阐述了一个重要观点,即:安全要素信息呈现出大数据的特征...
如何利用交换机和端口设置来管理... 在网络管理中,总是有些人让管理员头疼。下面我们就将介绍一下一个网管员利用交换机以及端口设置等来进行D...
全面诠释网络负载均衡 负载均衡的出现大大缓解了服务器的压力,更是有效的利用了资源,提高了效率。那么我们现在来说一下网络负载...
如何允许远程连接到MySQL数... [[277004]]【51CTO.com快译】默认情况下,MySQL服务器仅侦听来自localhos...
30分钟搞定iOS自定义相机 最近公司的项目中用到了相机,由于不用系统的相机,UI给的相机切图,必须自定义才可以。就花时间简单研究...
Intel将Moblin社区控... 本周二,非营利机构Linux基金会宣布,他们将担负起Moblin社区的管理工作,而这之前,Mobli...