1、 建立消息隊列 1 windows
1) 在遠程服務器上建立消息隊列,具體步驟參見前面 10.net
6、在IIS中寄宿MSMQ綁定的WCF服務實現分佈式部署 16
右鍵選擇計算機/這臺電腦——管理——服務和應用程序——消息隊列——專用隊列——新建——專用隊列,輸入隊列的名稱,不要勾選事物性隊列,便可完成建立非事物性私有隊列。
建立非事物性私有隊列
完成建立隊列之後,必須設置隊列的訪問權限,不然沒法經過隊列發送接收消息。右鍵選擇隊列屬性——安全選項卡,將everyone和anonymous權限設置爲徹底控制。以下圖所示:
Everyone徹底控制
Anonymous徹底控制
在VS中建立一個解決方案,而且新建一個類庫項目,兩個控制檯項目上圖所示。
在WCFMSMQDemo.Service服務層中建立一個名爲IHelloService的接口做爲服務契約,建立一個名爲HelloClient的實現IHelloService接口的類做爲服務類。在服務契約中定義一個無返回值的單項訪問的方法。消息隊列支持無返回值的單向訪問。具體代碼以下:
[ServiceContract]
public interface IHelloService
{
/// <summary>
///發送消息的方法
/// </summary>
/// <param name="message"></param>
[OperationContract(IsOneWay = true)]
void SendMessage(string message);
}
設置方法的屬性IsOneWay=true,返回值爲void
服務端代碼以下所示:
public class HelloClient:IHelloService
{
public void SendMessage(string message)
{
Console.WriteLine("接收到來自客戶端的消息" + message);
}
}
完成契約定義和服務實現之後就能夠配置服務端,在Server中添加對Service項目的引用,並添加引用System.ServiceModel,編譯生成一下整個解決方案,不然在配置服務端配置文件的時候沒法出現智能提示。基於消息隊列綁定的WCF服務須要使用net.msmq協議綁定,服務的地址設置爲以下格式net.msmq://消息隊列所在服務器ip/{private}/隊列名稱。若是是私有隊列必須加上private,公共隊列則無需加上。因爲咱們建立的是私有隊列因此服務的地址爲net.msmq://localhost/private/myqueue。因爲是非事物性隊列因此須要這是綁定屬性exactlyOnce="false"。這裏咱們的WCF服務只是用來演示如何調用消息隊列就再也不設置安全驗證模式,直接設置不採用任何安全驗證方式<security mode="None" />
具體設置代碼以下所示:
<system.serviceModel>
<services>
<service name="WCFMSMQDemo.Service.HelloClient">
<endpoint address="net.msmq://192.168.103.66/private/myqueue" bindingConfiguration="NoneSecurity" binding="netMsmqBinding" contract="WCFMSMQDemo.Service.IHelloService">
</endpoint>
</service>
</services>
<bindings>
<netMsmqBinding>
<binding name="NoneSecurity" exactlyOnce="false" queueTransferProtocol="Native">
<security mode="None" />
</binding>
</netMsmqBinding>
</bindings>
</system.serviceModel>
設置完服務端配置文件之後須要設置一下客戶端的配置文件,客戶端配置文件與普通的WCF服務端配置稍有不一樣,具體配置以下:
<system.serviceModel>
<client>
<endpoint address="net.msmq://localhost/private/myqueue" binding="netMsmqBinding" bindingConfiguration="NoneSecurity" contract="WCFMSMQDemo.Service.IHelloService" name="msmqService">
</endpoint>
</client>
<bindings>
<netMsmqBinding>
<binding name="NoneSecurity" exactlyOnce="false" queueTransferProtocol="Native">
<security mode="None" />
</binding>
</netMsmqBinding>
</bindings>
</system.serviceModel>
using (ServiceHost host = new ServiceHost(typeof(HelloClient)))
{
host.Open();
Console.WriteLine("WCF 服務已經啓動@" + DateTime.Now);
Console.ReadKey();
}
服務端代碼
using (ChannelFactory<IHelloService> channelFactory = new ChannelFactory<IHelloService>("msmqService"))
{
IHelloService proxyeService = channelFactory.CreateChannel();
proxyeService.SendMessage("Hello World");
Console.WriteLine("調用服務成功");
Console.ReadKey();
}
客戶端實現代碼
最後啓動服務端和客戶端後運行結果以下:
修改客戶端代碼實現,模擬併發1000次訪問,客戶端實現代碼以下:
using (ChannelFactory<IHelloService> channelFactory = new ChannelFactory<IHelloService>("msmqService"))
{
IHelloService proxyeService = channelFactory.CreateChannel();
Parallel.For(0, 1000, i =>
{
proxyeService.SendMessage("Hello World" + i);
Console.WriteLine("調用服務端" + i);
});
Console.WriteLine("調用成功");
Console.ReadKey();
}
啓動服務端,而後啓動客戶端,運行結果以下
客戶端請求結果,模擬併發1000次訪問只用了407毫秒
服務端請求結果
右鍵選擇計算機——管理——服務和應用程序——消息隊列——屬性——服務器安全性——取消勾選"禁用未經身份驗證的RPC調用",不然沒法經過消息隊列收發消息。
Windows 7 上消息隊列屬性設置
若是是在windows server2008 r2服務器系統上設置會有所不一樣
Windows server 2008 r2 上消息隊列設置
將地址中的修改成消息隊列上服務器上對應的消息隊列地址。net.msmq://192.168.103.66/private/myqueue。遠程服務器上必須存在消息隊列,不然會提示沒法打開指定的消息隊列。修改後的綁定地址以下
<system.serviceModel>
<services>
<service name="WCFMSMQIISDemo.Service.HelloClient" behaviorConfiguration="HttpGetEnable">
<endpoint address="net.msmq://192.168.103.66/private/HelloService.svc" binding="netMsmqBinding" bindingConfiguration="NoneSecurity" contract="WCFMSMQIISDemo.Service.IHelloService">
</endpoint>
<endpoint address="mex" binding ="mexHttpBinding" contract="IMetadataExchange">
</endpoint>
</service>
</services>
<bindings>
<netMsmqBinding>
<binding name="NoneSecurity" exactlyOnce="false" queueTransferProtocol="Native">
<security mode="None" />
</binding>
</netMsmqBinding>
</bindings>
<behaviors>
<serviceBehaviors>
<behavior name="HttpGetEnable">
<serviceMetadata httpGetEnabled="true"/>
<serviceDebug includeExceptionDetailInFaults="true"/>
</behavior>
</serviceBehaviors>
</behaviors>
<serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true">
</serviceHostingEnvironment>
</system.serviceModel>
運行服務端和客戶端後結果以下
使用消息隊列收發消息,若是客戶端與服務端沒法及時通訊,那麼客戶端發送的請求消息會暫時保存在本機的消息隊列中,前提是本機中安裝了消息隊列服務,不然沒法實現離線調用功能。當客戶端可以與服務端正常通訊之後,客戶端上的消息會被自動發送到服務端的消息隊列中而後被服務端處理掉。下面演示一下離線使用WCF服務
首先將客戶端和服務端綁定的消息隊列地址改成遠程服務器上的地址net.msmq://192.168.103.66/private/myqueue,禁用本地網卡,而後啓動客戶端
客戶端功能仍然能使用,咱們再看看本地消息隊列中是否有數據
能夠看到本地傳出隊列中有一條消息指向遠程服務器上的消息隊列。如今啓用網卡再看看本地消息隊列——傳出隊列和遠程服務器消息隊列專用隊列各有什麼變化。
刷新一下,本地消息隊列中的傳出隊列中已經沒有消息了,再看一下遠程服務器上專用隊列中是否有消息
遠程服務器上隊列中已經有消息了,而且消息ID和本地傳出隊列中保存過的消息的消息ID一致,證實是同一條消息通過本地傳遞到了遠程服務器上。最後運行一下服務端看可否正確處理消息。
服務端成功處理了客戶端離線發送的消息。
經過sefhost雖然也能實現WCF服務的託管可是部署上仍是有不少的侷限性,那麼基於MSMQ消息隊列的WCF服務是否能在IIS中託管呢,答案是確定的。經過微軟的進程激活服務(WAS)便可實現非Http綁定的WCF在IIS中託管。要實現非Http綁定的WCF服務在IIS中託管須要作如下步驟的修改。
右鍵選擇開始菜單——控制面板——程序和功能——打開或關閉windows功能,找到.net framwork3.5.1 啓用如下功能
Windows 7下實現
Windows server 2008 r2 服務器上
Windows 8/8.1須要安裝.net3.5 並勾選windows communication foundation 非http激活和.net4.5中的wcf服務下的消息隊列(MSMQ)激活。
首先建立一個名爲HelloService.svc的私有非事物性隊列,並設置隊列能夠遠程訪問。而後建立WCF服務。建立WCF服務具體服務定義以下
public class HelloClient : IHelloService
{
public void SendMessage(string message)
{
File.WriteAllText(@"D:\test.txt", message, Encoding.Default);
}
}
設置爲msmq綁定,同時開啓元素數據獲取。具體服務端配置文件以下
<system.serviceModel>
<services>
<service name="WCFMSMQIISDemo.Service.HelloClient" behaviorConfiguration="HttpGetEnable">
<endpoint address="net.msmq://192.168.103.66/private/HelloService.svc" binding="netMsmqBinding" bindingConfiguration="NoneSecurity" contract="WCFMSMQIISDemo.Service.IHelloService">
</endpoint>
<endpoint address="mex" binding ="mexHttpBinding" contract="IMetadataExchange">
</endpoint>
</service>
</services>
<bindings>
<netMsmqBinding>
<binding name="NoneSecurity" exactlyOnce="false" queueTransferProtocol="Native">
<security mode="None" />
</binding>
</netMsmqBinding>
</bindings>
<behaviors>
<serviceBehaviors>
<behavior name="HttpGetEnable">
<serviceMetadata httpGetEnabled="true"/>
<serviceDebug includeExceptionDetailInFaults="true"/>
</behavior>
</serviceBehaviors>
</behaviors>
</system.serviceModel>
完成服務端代碼實現之後,便可在IIS中建立網站並添加msmq綁定來實現服務的寄宿。在IIS中新建一個網站,並將網站目錄指向建立的WCF所在目錄。添加網站的msmq綁定,右鍵網站——編輯綁定——添加,類型選擇net.msmq,綁定信息填寫消息隊列服務器所在地址,如192.168.103.66。
點擊添加按鈕添加msmq綁定
默認是http綁定
將添加類型改成net.msmq,綁定信息填寫消息隊列所在服務器ip
添加net.msmq綁定之後還要增長網站的net.msmq支持,右鍵網站——管理網站——高級設置——已啓用的協議中添加net.msmq
設置完成之後便可啓動網站,訪問網站下的HelloService.svc文件,如http://localhost:8080/HelloService.svc
啓動wcftestclient,添加服務引用
查看D盤根目錄下文件
有內容寫入,證實服務運行成功。
若是你對本文有什麼不明白的地方能夠與我聯繫,或者有更好的建議與意見歡迎與我交流。QQ:489505067