在WCF中使用消息队列MSMQ
在WCF中使用消息队列MSMQ
在windows平台上,MSMQ是首选的消息传递中间件,它是一种高速、异步、可靠的通信机制,当我们在Internet上的两个应用需要交换信息时,使用这样的中间件可能是必须的。
构建企业级可靠的、异步的、消息应用方案,方案的设计目标是在Client/Server端建立可靠的、异步的通信。系统采用MSMQ作为传输机制,因为MSMQ支持可靠的队列通信。MSMQ部署在三方Server上(一般集群部署,避免单点故障)。Client端应用程序使用WCF的NetMsmqBingding来发送消息到MSMQ Server的私有队列。Service 服务程序将部署在IIS 7.0,并采用Windows Activation Services(WAS)来监听消息队列上的新消息。通过SMSvnHost.exe – Windows 服务程序来实现监听,当有消息到达时,它负责在IIS Worker process激活service服务,然后service服务将处理消息。整体的架构如下所示:
WCF完全面向SOA,大大简化了以往风格迥异的多种分布式解决方案。本事示例在WCF中使用MSMQ的方法。下面以一个例子说明。
首先定义服务端和客户端赖以沟通的Contract,通常将这些Contact定义在一个单独的dll中,如此可被服务端和客户端引用。我们假设一个简单的Contract,即一个接口ILoginService:
C#代码
- [ServiceContract]
- public interface ILoginService
- {
- ///<summary>
- ///SetHello
- ///</summary>
- ///<returns></returns>
- [OperationContract(IsOneWay = true)]
- void SetHello(string pStr);
10. }
- 11.
服务端需要实现ILoginService接口:
C#代码
- [ServiceBehavior(IncludeExceptionDetailInFaults = true, InstanceContextMode = InstanceContextMode.PerCall)]
- public class LoginService:ILoginService
- {
- void ILoginService.SetHello(string pStr)
- {
- string bb = pStr;
- }
- }
接下来,服务端就可以以MSMQ的方式发布该服务了,这个可以在配置文件App.Config中进行配置:
XML/HTML代码
- <?xml version="1.0" encoding="utf-8" ?>
- <configuration>
- <system.serviceModel>
- <services>
- <service name="WCFDemo.LoginService">
- <endpoint address="net.msmq://localhost/private/WcfTest"
- binding="netMsmqBinding" bindingConfiguration="msmq"
- contract="WCFDemo.ILoginService"/>
- </service>
- 10. </services>
- 11.
- 12. <bindings>
- 13. <netMsmqBinding>
- 14. <binding name="msmq">
- 15. <security mode ="None"/>
- 16. </binding>
- 17. </netMsmqBinding>
- 18. </bindings>
- 19.
- 20. </system.serviceModel>
21. </configuration>
配置中,address表明了将使用本地的名为WcfTest的专用队列。请注意,binding配置后有一个bindingConfiguration,说明这个binding需要更高级的配置,相应的配置段在bindings Segment中,由于示例中使用的消息队列没有使用域模式,所以security mode 设为None,该配置会将MsmqAuthenticationMode属性设置为MsmqAuthenticationMode.None。另外,配置中显示的WcfTest专用队列需要被设置为“事务性”,在创建队列的时候可以选择此属性。
配置完成后,我们可以启动该服务了:
C#代码
- new ServiceHost(typeof(WCFDemo.LoginService)).Open();
再来看客户端,非常简单,首先在App.Config中设置“ABC”(与服务端一致):
XML/HTML代码
- <?xml version="1.0" encoding="utf-8" ?>
- <configuration>
- <system.serviceModel>
- <client>
- <endpoint name="HelloClient"
- address="net.msmq://localhost/private/WcfTest"
- binding="netMsmqBinding" bindingConfiguration="msmq"
- contract="WCFDemo.ILoginService">
- </endpoint>
- 10. </client>
- 11.
- 12. <bindings>
- 13. <netMsmqBinding>
- 14. <binding name="msmq">
- 15. <security mode ="None"/>
- 16. </binding>
- 17. </netMsmqBinding>
- 18. </bindings>
- 19. </system.serviceModel>
20. </configuration>
在添加了对WCFDemo.dll的引用后,接下来就可以调用服务了:
C#代码
- ChannelFactory<WCFDemo.ILoginService> channelFactory = new ChannelFactory<ILoginService>("HelloClient");
- ILoginService calculate = channelFactory.CreateChannel();
- calculate.SetHello(this.textBox1.Text);
使用MSMQ作为消息传递基础设施后,有这样一个好处,当Internet不可用或者服务端没有启动时,客户端仍然可以调用SetHello方法将消息发送,当然,消息会暂存在队列中,等网络恢复或服务端启动后,这些队列中的消息将会被处理。
http://wenku.baidu.com/link?url=8ZvWBf2QA4E3FURrKW-qb7XLB1HxB9AkATqv5VCxPotNzjWKh75klBC7SEb-82z3evUezq1n8SOfnIE1BOW2SQ1GSHZweebpJbkoeg-2UUS
转载于:https://www.cnblogs.com/Jessy/p/3648972.html
在WCF中使用消息队列MSMQ相关推荐
- 如果令 A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 分别等于
如果令 A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 分别等于 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 ...
- 贝叶斯网专题4:概率推理中的变量消元方法
文章目录 第一部分:贝叶斯网基础 [1.1 信息论基础](https://blog.csdn.net/deepbodhi/article/details/119823055) [1.2 贝叶斯网基本概 ...
- F#中的异步和并行设计模式(三):代理
在这个系列的第三部分,我们解释了F#中的轻量级代理的和交互式代理,并且看过了一些与之相关的典型的设计模式,包括内部隔离状态. 第一部分分描述了F#是一种并行交互式语言及如何支持轻量级交互操作的,并且为 ...
- 总结一下F#中运算符的定义规则
F#允许开发人员定义或重载各类运算符,合理利用这一规则可以让编程变得方便,让代码更容易阅读.例如,在使用F#的MailboxProcessor的时候,我会习惯于定义一个运算符来代替显式的Post操作: ...
- 批处理之 for /f 中的delims和tokens
在For命令语踞饽参数F中,最难理解的就是Delims和Tokens两个选项,本文简单的做一个比较和总拮. "For /f"常用来解析文本,读取字符串.分工上,delims负责切分 ...
- vb6中使text控件的光标随着增加的内容向下移动
vb6中使text控件的光标随着增加的内容向下移动 Dim i As Integer Private Sub Command1_Click() Text1.Text = Text1.Text + &q ...
- [转]在资源管理器中使鼠标右键增加一个命令,运行cmd,同时使得当前路径为资源管理器当前的目录...
[转]在资源管理器中使鼠标右键增加一个命令,运行cmd,同时使得当前路径为资源管理器当前的目录 http://www.cnblogs.com/skywind/archive/2009/05/22/14 ...
- ios 动态化视图_如何在iOS应用中使高度收集视图动态化
ios 动态化视图 by Payal Gupta 通过Payal Gupta 如何在iOS应用中使集合视图的高度动态化 (How to make height of collection views ...
- WordPress中使主题支持小工具以及添加插件启用函数
https://www.jb51.net/article/76810.htm 这篇文章主要介绍了WordPress中使主题支持widget以及添加插件启用函数的方法,使WP可以使用小工具widget与 ...
- vue获取编辑器纯文字_vue中使用富文本编辑器
前端使用富文本编辑器的插件有很多,今天献上wangeditor的使用教程,教你如何在vue中使用富文本编辑器 wangeditor是一个萌新富文本编辑器,基于js和css,重点在于它轻量,如果你需要的 ...
最新文章
- 第4周小组作业:WordCount优化
- jrebel热部署不起作用_5种SpringBoot热部署方式,你用哪种?
- Java基础班学习笔记(6)
- 时代天使点燃口腔赛道,瑞尔集团离下一只“牙茅”还有多远?
- 大家好,给大家介绍一下,这是我的智能伙伴…..
- mysql查询很慢优化方法1
- 大专学历造假改成了211, 拿到了抖音Offer
- React.js 基础入门四--要点总结
- Java 输入一个整数,计算它各位上数字的和。(注意:是任意位的整数)
- Cocosd-x”设计模式“之五 :防御式编程”模式“
- 第三章 ASP.NET MVC (模型绑定)
- 国内一些比较大型的IT软件外包公司名单
- MacBook Pro 触摸板手势突然失效的解决方案
- Android屏幕渲染
- #日常---恒权码与变权码
- 模型量化论文阅读#3----Up or Down? Adaptive Rounding for Post-Training Quantization
- 阿里P8整理总结,入职大厂必备Java核心知识(附加面试题
- opengauss、GaussDB数据库安装-详细教程
- Hexo + Butterfly 从零开始搭建个人博客(三)
- Java第四十八天,Jsp之Taglib,自定义标签详解