WCF平台下MSMQ调用方式总结

如果在WCF服务中采用了MSMQ方式进行消息传递,那么怎么调用这个服务呢?
通过总结,发现至少有2种方式可以使用。

1. 由于WCF下MSMQ不能发布元数据,因此,要想通过net.msmq://***的方式发布、获取元数据,都是徒劳无获的。服务器端不发布元数据倒没有什么,可是客户端无法获得元数据,将无法编程,进而调用这个WCF服务。这怎么办?
还好,在《WCF服务编程》一书中,有这么一段:WCF不能在MSMQ上交换元数据。因此,对于一个只有队列调用的服务而言,同样可以以公开一个MEX终结点,或许允许基于HTTP-GET进行元数据交换,因为服务的客户端仍然需要一种方法获取服务的描述,并通过它实现绑定。

博客园中【webabcd(王磊)】有一篇介绍WCF和MSMQ的文章,介绍的就是采用HTTP-GET方式发布元数据,经实验发现,最终效果不错。

服务端部分示例代码如下:

< service name = " WCFClass.MSMQ "   behaviorConfiguration = " MessageBehavior " >
         < endpoint address = " net.msmq://localhost/private/MSMQ "  binding = " netMsmqBinding "  contract = " WCFClass.IMSMQ "  bindingConfiguration = " MSMQBindingConfiguration "  name = " abc "   />
        
< endpoint address = " mex "  binding = " mexHttpBinding "   contract = " IMetadataExchange "   />
        
< host >
          
< baseAddresses >
            
< add baseAddress = " http://localhost:12345/Message/MSMQ " />
            
< add baseAddress = " net.msmq://localhost/private/MSMQ " />
          
</ baseAddresses >
        
</ host >
      
</ service >

如此,在客户端添加对元数据的web引用后,即能实现。

2. 既然服务器端不便发布元数据,那么不妨让客户端直接引用服务端的服务接口。如此一来,元数据,你知、我知。服务器就能与获得元数据的客户端进行消息传递。最终效果也很好。

ChannelFactory < WCFClass.IMSMQ >  channelFactory  =   new  ChannelFactory < WCFClass.IMSMQ > ( " CalculatorClient " );
WCFClass.IMSMQ calculate 
=  channelFactory.CreateChannel();


此代码参考了博客园中【zhuweisky】的技术文章。感谢两位。

3.客户端通过MSMQ调用WCF服务流程示意图:

 

你可能感兴趣的:(WCF)