新聞中心
在了解了WCF之后,大家應(yīng)該會(huì)被他強(qiáng)大的功能,突出的優(yōu)勢(shì)所深深吸引。它能夠?yàn)槲覀冚p松的打造一個(gè)跨平臺(tái)的安全性極強(qiáng)的解決方案。在這里我們會(huì)為大家介紹一下MSMQ使用WCF的實(shí)現(xiàn)方法。#t#

在windows平臺(tái)上,MSMQ是***的消息傳遞中間件,它是一種高速、異步、可靠的通信機(jī)制,當(dāng)我們?cè)贗nternet上的兩個(gè)應(yīng)用需要交換信息時(shí),使用這樣的中間件可能是必須的。
WCF完全面向SOA,大大簡(jiǎn)化了以往風(fēng)格迥異的多種分布式解決方案。剛好,最近的一個(gè)項(xiàng)目需要使用SOA架構(gòu),而底層需要使用MSMQ作為消息傳遞基礎(chǔ)設(shè)施,所以這兩天研究了一下,MSMQ使用WCF的方法。下面以一個(gè)例子說(shuō)明。
首先定義服務(wù)端和客戶端賴以溝通的Contract,通常將這些Contact定義在一個(gè)單獨(dú)的dll中,如此可被服務(wù)端和客戶端引用。我們假設(shè)一個(gè)簡(jiǎn)單的Contract,即一個(gè)接口ICalculate:
- [ServiceContract]
- [ServiceContract]
- public interface ICalculate
- {
- [OperationContract(IsOneWay=true)]
- void DealOrder(string orderID);
- }
例子中,我們將ICalculate定義在WcfLib.dll中。
服務(wù)端需要實(shí)現(xiàn)ICalculate接口:
- public class Calculator : ICalculate
- {
- public void DealOrder(string orderID)
- {
- Program.FileLogger.Log(orderID);
- }
- }
接下來(lái),服務(wù)端就可以以MSMQ的方式發(fā)布該服務(wù)了,這個(gè)可以在配置文件App.Config中進(jìn)行配置:
- < ?xml version="1.0" encoding="utf-8" ?>
- < configuration>
- < system.serviceModel>
- < services>
- < service name="WcfTest.Calculator">
- < endpoint address="net.msmq://localhost/private/WcfTest"
- binding="netMsmqBinding" bindingConfiguration="msmq"
- contract="WcfLib.ICalculate"/>
- < /service>
- < /services> < bindings>
- < netMsmqBinding>
- < binding name="msmq">
- < security mode ="None"/>
- < /binding>
- < /netMsmqBinding>
- < /bindings>
- < /system.serviceModel>
- < /configuration>
配置中紅色部分標(biāo)志了WCF的“ABC”,address表明了將使用本地的名為WcfTest的專用隊(duì)列。請(qǐng)注意,binding配置后有一個(gè)bindingConfiguration,說(shuō)明這個(gè)binding需要更高級(jí)的配置,相應(yīng)的配置段在bindings Segment中,由于示例中使用的消息隊(duì)列沒(méi)有使用域模式,所以security mode 設(shè)為None,該配置會(huì)將MsmqAuthenticationMode屬性設(shè)置為MsmqAuthenticationMode.None。另外,配置中顯示的WcfTest專用隊(duì)列需要被設(shè)置為“事務(wù)性”,在創(chuàng)建隊(duì)列的時(shí)候可以選擇此屬性。
配置完成后,我們可以啟動(dòng)MSMQ使用WCF的服務(wù)了:
- ServiceHost serviceHost = new ServiceHost(typeof(Calculator));
- serviceHost.Open();
再來(lái)看客戶端,非常簡(jiǎn)單,首先在App.Config中設(shè)置“ABC”(與服務(wù)端一致):
- < ?xml version="1.0" encoding="utf-8" ?>
- < configuration>
- < system.serviceModel>
- < client>
- < endpoint name="CalculatorClient"
- address="net.msmq://localhost/private/WcfTest"
- binding="netMsmqBinding" bindingConfiguration="msmq"
- contract="WcfLib.ICalculate">
- < /endpoint>
- < /client>
- < bindings>
- < netMsmqBinding>
- < binding name="msmq">
- < security mode ="None"/>
- < /binding>
- < /netMsmqBinding>
- < /bindings>
- < /system.serviceModel>
- < /configuration>
在添加了對(duì)WcfLib.dll的引用后,接下來(lái)就可以調(diào)用服務(wù)了:
- ChannelFactory< WcfLib.ICalculate> channelFactory =
new ChannelFactory< ICalculate>("CalculatorClient");- ICalculate calculate = channelFactory.CreateChannel();
- calculate.DealOrder(this.textBox1.Text);
MSMQ使用WCF作為消息傳遞基礎(chǔ)設(shè)施后,有這樣一個(gè)好處,當(dāng)Internet不可用或者服務(wù)端沒(méi)有啟動(dòng)時(shí),客戶端仍然可以調(diào)用DealOrder方法將消息發(fā)送,當(dāng)然,消息會(huì)暫存在隊(duì)列中,等網(wǎng)絡(luò)恢復(fù)或服務(wù)端啟動(dòng)后,這些隊(duì)列中的消息將會(huì)被處理。
文章名稱:MSMQ使用WCF正確實(shí)現(xiàn)技巧講解
瀏覽地址:http://www.dlmjj.cn/article/copsjje.html


咨詢
建站咨詢
