简要回顾一下MSMQ的基本概念,详细的你们可以参考, name,DateTime.Now);
}
}
(2)宿主:
我的开发环境为XP专业版,工作组模式。这里有个问题要注意,就是安全。MSMQ默认的安全模式是需要证书支持。我们必须在宿主配置文件里给配置为 none,简化操作,因为证书需要MSMQ域管理器。MSMQ传输安全需要Windows安全,这个又需要AD活动目录支持,工作组模式下不支持,因此这 里我们都设置为none。代码如下:
<service behaviorConfiguration="WCFService.WCFServiceBehavior"
name="WCFService.WCFMSMQService">
<endpoint
address="net.msmq://localhost/Private/FrankWCFMSMQ"
binding="netMsmqBinding"
contract="WCFService.IWCFMSMQService" bindingConfiguration="msmq" >
</endpoint>
<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
<host>
<baseAddresses>
<add baseAddress="http://localhost:8001/"/>
</baseAddresses>
</host>
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior name="WCFService.WCFServiceBehavior">
<serviceMetadata httpGetEnabled="true" />
<serviceDebug includeExceptionDetailInFaults="false" />
</behavior>
</serviceBehaviors>
</behaviors>
<bindings>
<netMsmqBinding>
<binding name="msmq" durable="false" exactlyOnce="false">
<security mode="None">
<transport msmqProtectionLevel="None"/>
<message clientCredentialType="None"/>
</security>
</binding>
</netMsmqBinding>
</bindings>
(3)客户端:
运行客户端,添加服务引用,这里客户端的配置文件要做修改,安全模式也修改和宿主对应,设置为none。客户端测试方案是每个2秒调用一次服务请求。我们 这里在宿主端打印了时间。客户端发送消息完毕以后,宿主暂时不启动。等待一段时间。在启动宿主,观察宿主打印的消息。代码如下:
WCFMSMQServiceClient wcfServiceProxy = new WCFMSMQServiceClient("NetMsmqBinding_IWCFMSMQService");
//通过代理调用SayHello服务,这里及时服务调用服务失败,消息会发送到队列里进行缓存。
Console.WriteLine("WCF First Call at:{0}",DateTime.Now);
wcfServiceProxy.SayHelloMSMQ("Frank");
Thread.Sleep(2000);//客户端休眠两秒,继续下一次调用
Console.WriteLine("WCF Second Call at:{0}", DateTime.Now);
wcfServiceProxy.SayHelloMSMQ("Frank Xu");
Thread.Sleep(2000);//客户端休眠两秒,继续下一次调用
Console.WriteLine("WCF Last Call at:{0}", DateTime.Now);
wcfServiceProxy.SayHelloMSMQ("Frank Xu Lei");
(4)运行结果:
首先是客户端发送到的消息,我们可以再计算机-管理-服务-专用队列里查看到,如图:
以前的服务要求我们必须启动宿主,不然会出现连接错误。这里为了测试,停留约4分钟后,我们启动宿主。观察宿主打印的消息:
宿主在联机以后响应了客户端的调用操作。
【总结】
本节文章主要讲解的是WCF 如何使用MSMQ开发离线服务操作。这里除了回顾了MSMQ的基本概念,还介绍了WCF服务使用MSMQ的通信框架的优势和特点。最后给出了基于WCF 消息队列的离线服务调用实现的过程。
WCF 对MSMQ消息队列的支持和扩展,大大提高了WCF服务调用的伸缩性和灵活性。本文由于开发环境的关系,没有给出公共队列的开发实现过程。另外在WCF 消息队列开发过程中,大家要做注意。
(1)在服务宿主端启动宿主,要做队列存在的判断,以免出现读取错误。
(2)队列服务涉及到安全的问题,认证和消息加密,签名,需要证书的配置。条件限制这里就没有给出具体的实现过程。
(3)WCF队列服务的另外一个重要概念就是对离线事务的支持。这一特性会在后续文章里给出。
(4)运行环境:Xp pro,.net 3.0以上,vs2008,至少安装MSMQ队列的私有队列组件服务。