最近都在鼓捣这个WCF,因为看到说WCF比WebService功能要强大许多,另外也看了一些公司的招聘信息,貌似一些中、高级的程序员招聘,都有提及到WCF这一块,所以,自己也关心关心一下,虽然目前工作上没用用到。就到园子里面找啊找,翻啊翻,还是给我翻到几篇关于WCF消息队列的教程,其中本次推荐的是:陈希章 写的这篇:在WCF中使用消息队列,本文就在他写的这个WCF的一个基础下,完善一下他忽略到的内容以及详细步骤,在此也非常感谢陈希章的辛苦劳作,让我快捷的接触到了WCF的消息队列,非常感谢。如果有人对消息队列还不大清楚的,请移步到他的文章去先了解一下,网址:http://www.cnblogs.com/chenxizhang/archive/2009/12/22/1629990.html

        一、首先,我们还是要建立一个WCF服务应用程序,如下图:
 
 
接着把这两个自动生成的例子删掉
 
        二、在项目解决方案上面右键,新建一个类库,如下图:
 
LMX.WCF.MQModel
 
 
然后再把自动生成的一个类Class1.cs删掉,如下图:
 
        三、接下来,我们添加一个消息队列的类,OrderEntry.cs,如下图:
 
类的详细代码如下:
    [DataContract]
    public class OrderEntry
    {
        [DataMember]
        public int OrderID { get; set; }
        [DataMember]
        public DateTime OrderDate { get; set; }
        [DataMember]
        public int Quantity { get; set; }
        [DataMember]
        public int UnitPrice { get; set; }
 
        public override string ToString()
        {
            return string.Format(
                "ID:{0}\tDate:{1}\tQuantity:{2}\tUnitPrice:{3}\t",
                OrderID,
                OrderDate,
                Quantity,
                UnitPrice);
        }

}

 
 
这里需要添加引用:System.Runtime.Serialization.dll
 
完整代码如下图:
 
 
 
        四、接下来,我们添加消息队列的服务,如下图:
 
 
我们命名为:Services.svc,如下图:
 
其中IService的代码如下:
    [ServiceContract]
    public interface IMSMQService
    {
        [OperationContract(IsOneWay = true)]
        void PlaceOrder(OrderEntry entry);

}

 
 
Services.svc.cs的代码如下:
 
 
 
这时候页面提示出错,因为没有找到OrderEntry的类,所以,我们要添加引用,我们要引用这个Model,如下:
 
 
 
我们需要引用这个Model,这样,页面再把鼠标放到代码上面的“灯泡”处,就会提示引用Model了,如下图:
 
 
 
 

五、至此,我们已经把服务搭建好了,接下来就是“宿主”,类似我们的Web所需要的IIS一样,其实WCF的“宿主”也可以是IIS,这次,我们就用一个“控制台“来做”宿主“,如下图,我们新建一个LMX.WCF.MQHost
 

 
    接着,我们添加dll引用:System.ServiceModel.dll,以及项目引用,如下图:
 
 
    最后,cs文件代码如下:
 
using LMX.WCF.MQService;
using System;
using System.ServiceModel;
 
namespace LMX.WCF.MQHost
{
    class Program
    {
        static void Main(string[] args)
        {
            using (ServiceHost host =
                new ServiceHost(
                    typeof(MSMQOrderService),
                    new Uri("net.msmq://localhost/Private/LMXQueue")
                    ))
            {
 
                NetMsmqBinding binding = new NetMsmqBinding(NetMsmqSecurityMode.None);
                binding.ExactlyOnce = false;
                binding.Durable = true;
 
                host.AddServiceEndpoint(
                    typeof(IMSMQService).FullName,
                    binding,
                    "");
 
                host.Open();
                Console.WriteLine("服务器已经准备好");
                Console.Read();
 
            }
        }
    }

}

 
六、至此,我已经发“宿主”给配置好了,接下来,就是我们的客户端了,客户端的样式也可以有多重,有Web,有应用程序。这次我们依然使用“控制台应用程序”来做客户端。
 
        首先,我们新建一个名为LMX.WCF.MQClient:的”控制台应用程序“,如下图:
 
 
 
    接着,我们添加dll引用:System.ServiceModel.dll,以及项目引用,如下图:
 
        CS代码如下:
 
using LMX.WCF.MQModel;
using LMX.WCF.MQService;
using System;
using System.ServiceModel;
 
namespace LMX.WCF.MQClient
{
    class Program
    {
        static void Main(string[] args)
        {
            NetMsmqBinding binding = new NetMsmqBinding(NetMsmqSecurityMode.None);
            binding.ExactlyOnce = false;
            binding.Durable = true;
 
 
            ChannelFactory<IMSMQService> channel =
                new ChannelFactory<IMSMQService>(
                    //这里面解释一下:localhost代表是本机服务器,Private字面上是私有,这里面表示是“消息队列”里面的“专用队列”,“LMXQueue”是我们专用队列的一个类似“消息组”的一个名称。
                    binding, new EndpointAddress("net.msmq://localhost/Private/LMXQueue"));
 
            IMSMQService client =
                channel.CreateChannel();
 
            client.PlaceOrder(
                new OrderEntry()
                {
                    OrderID = 1,
                    OrderDate = DateTime.Now,
                    UnitPrice = 10,
                    Quantity = 10
                });
 
            Console.WriteLine("发送了一个订单");
            Console.Read();
        }
    }
}
 
        到这里,我们已经把整个WCF消息队列的一个实例demo完成了,现在我们启动一下这个Client(设为启动项),就是客户端,看看他跑起来是怎样的,如下图:
 
        
        然后在“F5”跑起来,如下图:
    
 
 
        我们发现,跑起来的时候,发现有这个报错,但是,你不用急哟。因为,既然敢写,那就必须要保证这个demo能跑起来呀,O(∩_∩)O哈哈~
这里,就给大伙儿讲解一下这个报错的缘故。看错误提示信息是说:队列不存在或者权限不足。
 
        权限不足:首先这个权限不足我们可以优先排除,因为我们在代码当中,我们已经把消息队列的安全模式设置为none了,应该就是没有什么限制的了,具体代码在这里:
            NetMsmqBinding binding = new NetMsmqBinding(NetMsmqSecurityMode.None);
            binding.ExactlyOnce = false;

binding.Durable = true;

 
         队列不存在:按道理来说,应该就是它的问题了。前面我有解析到,这个“LMXQueue”是我们的消息队列的名称,那我们去看看我们的消息队列里面有没有这个名称。
 

 
         七、现在,我们去找找消息队列的位置,首先右键"我的电脑”→“管理”,
或者
 
 
总之,你要找到“管理”,然后找到“消息队列”,如下图:
 
 
        
        我们看到这个”专用队列“,下面有一个叫”SampleQueue“的”专有队列“的分组,这个就是我上面提到的,跟” LMXQueue“同等级的一个分组名称。由于目前,我们的消息队列里面没有LMXQueue 这个分组,所以,导致报错,现在,我们需要手动新建一个” LMXQueue“的分组,如下图:
 
 
 
    如此,我们就完成了,现在我们再启动一下我们的“Client”,客户端看看,操作:F5。
 
    这次,我们就顺利运行了,窗体截图如下:
 
 
    发送了一个订单,那么这个订单去哪里了呢?嘿嘿,当然了,这个就存在这个“消息队列”里面了,我们刷新一下刚刚那个”LMXQueue“里面的内容,我们发现,消息就存在这里了。
 
        
        通过截图,我们看到,我们发送的消息已经存在在“消息队列”里面了。但是,我们想到了,他会一直存在”消息队里“里面吗?答案当然是”否“了,因为我们目前还没启动”客户端“,就是我们还没有接收这个”消息“,所以,他一直会存在,知道我们把这个”消息“接收了,他就会自动消失了。所以,这个消息队列,就非常适用于,对通讯要求极高的系统,防止你断线或者服务器宕机。你想呀,如果你QQ聊天的过程中,你发送一条”QQ“信息给对方,要等腾讯的服务器收到你的信息后,再把你的信息显示到对话窗口上,那即使速度再快,也有一定的延迟,但是,如果你把QQ信息放到本机的消息队列里面,然后对话框在读取消息队列,那岂不是瞬间完成的事(上述关于腾讯的是我个人YY,我个人并不知道腾讯是否这样干的。),上面只是一个列子,具体消息队列要怎么用,那就见仁见智了。
 
        
        八、现在,我们已经把“客户端”搞定了,现在我们去启动我们的“宿主”Host,然后看看我们能否接收这个“消息”,现在设置“Host”为启动项,看看。:

        
        然后再“F5”启动看看:
 
        在这里,我们看到,程序启动之后,就可能接收到之前存在”消息队列“里面的消息了。后续我们要运用到项目中去,就可以在接收”队列消息“里面对这些消息做相应的操作即可。
 
        九、最后,我们再去“消息队列”里面看看,之前我们发送的订单,还在不在,我们去刷新一下看看:
 
        发现,我们的Host启动之后,把队列消息接收之后,“消息队列”里面就已经把消息清空了,如下图:
 
 
 
到这里,就大功告成啦,接下来的东西,就由大家自己去展开拓展了,本次经验分享到此结束,如果觉得写得不错,或者对你有帮助,请点“好文要顶”或者“关注我”,转载请保留原作者地址以及姓名
 
我新建一个QQ群,如果有问题,可以在群里提。如果合适,也会根据大家提的比较多的问题,来写篇博文,帮助更多的人,群号:275523437
点击链接加入群【.Net,MVC,EasyUI,MUI,Html,JS】:http://jq.qq.com/?_wv=1027&k=2A0RbLd
 
 
(如果有私活,或者一起合作的,也可以私信找我呀,嘿嘿);
 
作者:南宫萧尘  
E-mail:314791147@qq.com
QQ:314791147
日期:2016-05-17

【原创经验分享】WCF之消息队列的更多相关文章

  1. Nginx集群之WCF分布式消息队列

    目录 1       大概思路... 1 2       Nginx集群之WCF分布式消息队列... 1 3       MSMQ消息队列... 2 4       编写WCF服务.客户端程序... ...

  2. 【原创经验分享】JQuery(Ajax)调用WCF服务

    最近在学习这个WCF,由于刚开始学 不久,发现网上的一些WCF教程都比较简单,感觉功能跟WebService没什么特别大的区别,但是看网上的介绍,就说WCF比WebService牛逼多少多少,反正我刚 ...

  3. WCF MSMQ消息队列与离线操作

    消息队列类型 公共队列:整个网络中的节点都可以访问到 专用队列:本地计算机,知道路径者可以访问 管理队列:包含确认在给定“消息队列”网络中的发送的消息回执的消息 相应队列:返回给发送程序的相应信息

  4. rabbitmq学习(九) —— 关于消息队列的选型

    转自http://cmsblogs.com/?p=3846 在IM这种讲究高并发.高消息吞吐的互联网场景下,MQ消息中间件是个很重要的基础设施,它在IM系统的服务端架构中担当消息中转.消息削峰.消息交 ...

  5. 跟我一起学WCF(1)——MSMQ消息队列

    一.引言 Windows Communication Foundation(WCF)是Microsoft为构建面向服务的应用程序而提供的统一编程模型,该服务模型提供了支持松散耦合和版本管理的序列化功能 ...

  6. 在WCF中使用消息队列

    在一些大型的解决方案中,假设我们的服务没有办法一直在线,或者因为这样那样的原因宕机了,有没有什么办法让客户端的影响最小化呢?答案是可以通过消息队列的方式,哪怕服务是没有在线的,客户端依然可以继续操作. ...

  7. 分享一个c#写的开源分布式消息队列equeue

    分享一个c#写的开源分布式消息队列equeue 前言 equeue消息队列中的专业术语 Topic Queue Producer Consumer Consumer Group Broker 集群消费 ...

  8. WCF分布式开发步步为赢(13):WCF服务离线操作与消息队列MSMQ

    之前曾经写过一个关于MSMQ消息队列的文章:WCF分布式开发必备知识(1):MSMQ消息队列 ,当时的目的也是用它来作为学习WCF 消息队列MSMQ编程的基础文章.在那篇文章里,我们详细介绍了MSMQ ...

  9. 【原创】经验分享:一个小小emoji尽然牵扯出来这么多东西?

    前言 之前也分享过很多工作中踩坑的经验: 一个线上问题的思考:Eureka注册中心集群如何实现客户端请求负载及故障转移? [原创]经验分享:一个Content-Length引发的血案(almost.. ...

随机推荐

  1. Fis3的前端工程化之路[三大特性篇之声明依赖]

    Fis3版本:v3.4.22 Fis3的三大特性 资源定位:获取任何开发中所使用资源的线上路径 内容嵌入:把一个文件的内容(文本)或者base64编码(图片)嵌入到另一个文件中 依赖声明:在一个文本文 ...

  2. iOS总结_UI层自我复习总结

    UI层复习笔记 在main文件中,UIApplicationMain函数一共做了三件事 根据第三个参数创建了一个应用程序对象 默认写nil,即创建的是UIApplication类型的对象,此对象看成是 ...

  3. 深入浅出Redis-redis底层数据结构(上)

    1.概述 相信使用过Redis 的各位同学都很清楚,Redis 是一个基于键值对(key-value)的分布式存储系统,与Memcached类似,却优于Memcached的一个高性能的key-valu ...

  4. C++内存对齐总结

    大家都知道,C++空类的内存大小为1字节,为了保证其对象拥有彼此独立的内存地址.非空类的大小与类中非静态成员变量和虚函数表的多少有关. 而值得注意的是,类中非静态成员变量的大小与编译器内存对齐的设置有 ...

  5. Entity Framework Core 1.1 升级通告

    原文地址:https://blogs.msdn.microsoft.com/dotnet/2016/11/16/announcing-entity-framework-core-1-1/ 翻译:杨晓东 ...

  6. 【资源】.Net 入门@提高 - 逆天的高薪之路!

     入门看视频,提高看书籍,飘升做项目.老练研开源,高手读外文,大牛讲低调~    官方学习计划 http://www.cnblogs.com/dunitian/p/5667901.html ----- ...

  7. WPF做12306验证码点击效果

    一.效果 和12306是一样的,运行一张图上点击多个位置,横线以上和左边框还有有边框位置不允许点击,点击按钮输出坐标集合,也就是12306登陆的时候,需要向后台传递的参数. 二.实现思路 1.获取验证 ...

  8. 初步了解nodejs

    什么是Node.js? 很多初学者并没有真正地理解Node.js到底是什么.nodejs.org网站中的描述也没有多大帮助. 首先要清楚Node不是一个Web服务器,这十分重要.它本身并不能做任何事情 ...

  9. 运用php做投票题,例题

    要求大概是这样的,有一个题目,题目下面是复选框,要求点完复选框提交后会变成进度条,各选项的进度条百分比,和投票数量 首先还是要在数据库建两张表,如下: 要完成这个题目,需要建两个页面 <!DOC ...

  10. Android总结之链式调用(方法链)

    前言: 最近在学习总结Android属性动画的时候,发现Android的属性动画设计采用了链式调用的方式,然后又回顾了一下了以前接触的开源框架Glide也是采用链式调用的方式,还有最近火的一塌糊涂的R ...