在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#代码

  1. [ServiceContract]
  2. public interface ILoginService
  3. {
  4. ///<summary>
  5. ///SetHello
  6. ///</summary>
  7. ///<returns></returns>
  8. [OperationContract(IsOneWay = true)]
  9. void SetHello(string pStr);

10. }

  1. 11.

服务端需要实现ILoginService接口:

C#代码

  1. [ServiceBehavior(IncludeExceptionDetailInFaults = true, InstanceContextMode = InstanceContextMode.PerCall)]
  2. public class LoginService:ILoginService
  3. {
  4. void ILoginService.SetHello(string pStr)
  5. {
  6. string bb = pStr;
  7. }
  8. }

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

XML/HTML代码

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

21. </configuration>

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

配置完成后,我们可以启动该服务了:

C#代码

  1. new ServiceHost(typeof(WCFDemo.LoginService)).Open();

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

XML/HTML代码

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

20. </configuration>

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

C#代码

  1. ChannelFactory<WCFDemo.ILoginService> channelFactory = new ChannelFactory<ILoginService>("HelloClient");
  2. ILoginService calculate = channelFactory.CreateChannel();
  3. calculate.SetHello(this.textBox1.Text);

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

http://wenku.baidu.com/link?url=8ZvWBf2QA4E3FURrKW-qb7XLB1HxB9AkATqv5VCxPotNzjWKh75klBC7SEb-82z3evUezq1n8SOfnIE1BOW2SQ1GSHZweebpJbkoeg-2UUS

在​W​C​F​中​使​用​消​息​队​列​M​S​M​Q的更多相关文章

  1. F#中的自定义隐式转换

    我们知道隐式变换在可控情况下会使代码变得简洁.熟悉C#的都知道C#中可以自定义隐式变换,例如 public class A { private int data; public static impl ...

  2. 关于完整解答Leo C.W博客中名为“我们公司的ASP.NET 笔试题,你觉得难度如何”的所有题目

    关于完整解答Leo C.W博客中名为“我们公司的ASP.NET 笔试题,你觉得难度如何”的所有题目,请大家鉴定,不足之处,敬请指教! 第1到3题解答如下: public enum QuestionTy ...

  3. Django中使用富文本编辑器Uedit

    Uedit是百度一款非常好用的富文本编辑器 一.安装及基本配置 官方GitHub(有详细的安装使用教程):https://github.com/zhangfisher/DjangoUeditor 1. ...

  4. 在Visual Studio中使用用例图描述参与者与用例的关系

    在"在Visual Studio中使用用例图描述系统与参与者间的关系"中,使用用例图表示参与者与系统的关系,本篇体验参与者与用例(参与者要做的事情)的关系. 首先创建有关Custo ...

  5. java中使HttpDelete可以发送body信息

    java中使HttpDelete可以发送body信息RESTful api中用到了DELETE方法,android开发的同事遇到了问题,使用HttpDelete执行DELETE操作的时候,不能携带bo ...

  6. 6.6.1 F# 中函数调用的类型判断

    6.6.1 F# 中函数调用的类型判断 尽管,在 F# 中能够用尖括号指定类型參数值.与 C# 中的方式同样.但这样的方法非常少使用. 原因是,当编译器无法判断出全部的信息,须要程序猿的帮助时.我们仅 ...

  7. 解决echart在IE中使用时,在div中加入postion后图表不显示问题

    <!-- 为ECharts准备一个具备大小(宽高)的Dom --> <div id="main" style="height:400px;width:1 ...

  8. Django后台管理admin或者adminx中使用富文本编辑器

    在admin或者adminx后台中使用富文本编辑器 一.建立模型:(安装django-tinymce==2.6.0) from django.db import models from tinymce ...

  9. 项目中使token

    项目中使token 如果项目架构采用前后端分离,并采用分布式架构,通过定义接口API,与前端进行数据交互,前端通过html前行实现.若加入移动端(Andriod,ios)实现,可直接使用API接口实现 ...

随机推荐

  1. 【思路】-jscode

    jscode             //1.0 思路             //VH.PutSet(TagFields.PageName, PageName.Index);             ...

  2. C#.NET微信公众账号接口开发系列文章整理--微信接口开发目录,方便需要的博友查询

    前言: 涉及微信接口开发比较早也做的挺多的,有时间的时候整理了开发过程中一些思路案例,供刚学习微信开发的朋友参考.其实微信接口开发还是比较简单的,但是由于调试比较麻烦,加上微信偶尔也会给开发者挖坑,并 ...

  3. CSS入门

    CSS,层叠样式表,是对web页面显示效果进行控制的一套标准.当页面的内容受多种样式控制,将会按照一定的顺序处理.CSS的作用:(1)将网页的内容结构和格式控制分开.(2)可以精确控制页面的所有元素. ...

  4. Decorate Pattern 装饰者模式

    装饰模式的定义: 动态地将责任附加到对象向,若要扩展功能,装饰模式提供了比继承更有弹性的替代方案. 遵循的设计原则是开闭原则,也是对扩展开放,对修改关闭. 下面是类图 示例代码 /** *定义被装饰者 ...

  5. Spring Security (一)

    一.pom.xml <!-- spring security --> <dependency> <groupId>org.springframework.secur ...

  6. HTML+CSS--继续学习

    为网页中的文字设置字体为宋体. body{font-family:"宋体";} 文字以斜体样式在浏览器中显示: p a{font-style:italic;} 设置文字以粗体样式显 ...

  7. Anagrams

    这题Leetcode上面的描述不清楚.怎么也得举两个例子吧,不然谁懂? 题目的意思是,给定一些字符串,比如["abc","cba","bac" ...

  8. redis缓存技术学习

    1 什么是redis redis是一个key-value存储系统.和Memcached类似,它支持存储的value类型相对更多,包括string(字符串). list(链表).set(集合)和zset ...

  9. 2013年最棒的4个PHP框架

    PHP 框架可以帮你编写简洁可重用的代码,遵循 MVC 模式,确保应用逻辑和展现分离.有很多很多的框架各有千秋,有的性能好,有的文档全,还有的提供大量的内建功能等等. 这里我们罗列的 2013 年最好 ...

  10. web开发中常用的技术体系

    HTML html(HyperText  Markup  Language)超文本标记语言"超文本"就是指页面内可以包含图片.链接.程序等非文字元素. 超文本标记语言的结构包括&q ...