[C#.NET][WCF] MSMQ @IIS/WAS-host
WAS = Windows Process Activation Service,可裝載非 http / https 的載體,照常理來說 IIS 載體應該會比自己寫的載體還要可靠,所以 WAS Host 是必學的技巧
實作步驟
1.確定IIS已安裝
2.設定 WAS 支援非 HTTP 通訊協定
3.安裝 (或確認安裝) WCF 啟動元件
省的日後麻煩我全裝了…
Setp2.在 IIS 加入支援 net.msmq 通訊協定的服務
建立 AddMsmqSiteBinding.cmd 並輸入以下內容,並使用管理員身份執行,twoway是服務的名稱,可自行定義
%windir%\system32\inetsrv\appcmd.exe set site "Default Web Site" -+bindings.[protocol='net.msmq',bindingInformation='localhost'] %windir%\system32\inetsrv\appcmd.exe add app /site.name:"Default Web Site" /path:/TwowayService /physicalPath:%SystemDrive%\inetpub\wwwroot\twoway %windir%\system32\inetsrv\appcmd.exe set app "Default Web Site/twoway" /enabledProtocols:http,net.msmq %windir%\system32\inetsrv\appcmd.exe set apppool "DefaultAppPool" /managedRuntimeVersion:v4.0
居然無法利用 UI 新增 net.msmq,所以要依靠指令
命令執行成功之後,就可以看到 net.msmq 已經加入了
若要移除則輸入以下,或是直接在 UI 刪除
%windir%\system32\inetsrv\appcmd.exe set app "Default Web Site/twoway" /enabledProtocols:http
%windir%\system32\inetsrv\appcmd.exe delete app /app.name:"Default Web Site/twoway"
%windir%\system32\inetsrv\appcmd.exe set site "Default Web Site" --bindings.[protocol='net.msmq',bindingInformation='localhost']
%windir%\system32\inetsrv\appcmd.exe set apppool "DefaultAppPool" /managedRuntimeVersion:v4.0
rmdir /S /Q %SystemDrive%\inetpub\wwwroot\twoway
在這例子裡我需要兩條 queue,service.svc 會對應到相關服務
twoway/service.svc
twoway/response
開始前請先確定 queue 已經存在,若不存在請新增
設定接收權限
延續上一篇的例子 http://www.dotblogs.com.tw/yc421206/archive/2013/10/24/125435.aspx 上一篇的例子,是用 self-host 寫的,現在要實做WAS Host,所以我現在要將 Main(string[] args) 拿掉,然後修改以下
1.@ service 專案,加入名為 service.svc 的檔案,然後鍵入以下,其中 service.RequestService 是服務的名稱
<%@ ServiceHost Language="c#" Debug="true" Service="service.RequestService" %> <%@ Assembly Name="System.Transactions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" %>
2.將 app.config 更名為 web.config
<configuration> <startup> <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" /> </startup> <system.serviceModel> <bindings> <netMsmqBinding> <binding name="NoSecurity"> <security mode="None" /> </binding> </netMsmqBinding> </bindings> <services> <service name="service.RequestService"> <endpoint address="net.msmq://localhost/private/twoway/service.svc" binding="netMsmqBinding" bindingConfiguration="NoSecurity" contract="service.Contract.IRequestService" /> </service> </services> </system.serviceModel> </configuration>
3.確認所有的專案中的 net.msmq 路徑是否正確
net.msmq://" + hostName + "/private/twoway/service.svcnet.msmq://" + hostName + "/private/twoway/response
Step5.部署
1.接將 service 專案所產生的 *.dll 複製到 %SystemDrive%\inetpub\wwwroot\twoway\binclient.Contract.dllservice.Contract.dllservice.dll2.將web.config、service.svc 複製到 %SystemDrive%\inetpub\wwwroot\twoway或者是靠 VS 幫忙,在 Post-bulid 裡鍵入以下mkdir %SystemDrive%\inetpub\wwwroot\twoway
mkdir %SystemDrive%\inetpub\wwwroot\twoway\bin
copy "$(TargetDir)service.dll" %SystemDrive%\inetpub\wwwroot\twoway\bin
copy "$(TargetDir)client.Contract.dll" %SystemDrive%\inetpub\wwwroot\twoway\bin
copy "$(TargetDir)service.Contract.dll" %SystemDrive%\inetpub\wwwroot\twoway\bin
copy "$(ProjectDir)service.svc" %SystemDrive%\inetpub\wwwroot\twoway
copy "$(ProjectDir)web.config" %SystemDrive%\inetpub\wwwroot\twoway
http://localhost/twoway/service.svc
執行 client,確定 server 有回傳資料
文章出自:http://www.dotblogs.com.tw/yc421206/archive/2013/10/28/125731.aspx
範例下載:https://dotblogsfile.blob.core.windows.net/user/yc421206/1310/2013102814226336.zip
參考文章:http://msdn.microsoft.com/zh-tw/library/ms752246.aspx
若有謬誤,煩請告知,新手發帖請多包涵
Microsoft MVP Award 2010~2017 C# 第四季
Microsoft MVP Award 2018~2022 .NET