如何實現IIS 7.0對非HTTP協議的支持
在《再談IIS與ASP.NET管道》介紹各種版本的IIS的設計時,我們談到IIS 7.0因引入WAS提供了對非HTTP協議的支持。這個對於WCF的服務寄宿來說意義重大,它意味著我們通過IIS/WAS寄宿的服務終結點不僅僅可以采用BasicHttpBinding、WSHttpBinding/WS2007HttpBinding等基於HTTP協議的綁定,也可以采用NetTcpBinding、NetNamedPipeBinding和NetMsmqBinding。
在默認的情況下,IIS 7.0針對非HTTP支持的特性是關閉的。為了將一個IIS中的Web應用作為WCF服務的宿主,並采用非HTTP的通信協議,我們不但需要為Web應用所在的站點添加相應的站點綁定(net.tcp、net.pipe和net.msmq等),還需要為Web應用本身進行相應的設置使之允許相應的通信協議。我們可以通過三種方式實現相應的設置。
我們可以以命令行的方式執行Appcmd.exe來設置站點綁定和開啟某個Web應用針對某種協議的支持,該命令所在的目錄為%windir%\system32\inetsrv\。如下所示的命令通過Appcmd.exe為默認站點(Default Web Site)添加了基於net.tcp、net.pipe和net.msmq的站點綁定,其中net.tcp綁定采用默認端口808。然後在該站點下創建了一個名稱為WcfServices的Web應用,映射的物理路徑是C:\WcfServices\Service。最後為創建的Web應用同時開啟了針對http、net.tcp、net.pipe和net.msmq四種協議的支持。
1: REM 為站點” Default Web Site”添加針對net.tcp,net.pipe和net.msmq站點綁定
2: appcmd.exe set site "Default Web Site" –+bindings.[protocol='net.tcp',bindingInformation='808:*']
3: appcmd.exe set site "Default Web Site" –+bindings.[protocol='net.pipe',bindingInformation='*']
4: appcmd.exe set site "Default Web Site" –+bindings.[protocol='net.msmq',bindingInformation='localhost']
5:
6: REM 創建Web應用WcfServices
7: appcmd add app /site.name:"Default Web Site" /path:/WcfServices /physicalpath:C:\WcfServices\Service
8:
9: REM 為WcfServices應用開啟對http、net.tcp、net.pipe和net.msmq的支持
10: appcmd.exe set app "Default Web Site/WcfServices" /enabledProtocols:http,net.pipe,net.tcp,net.msmq
所有方式的設置都體現在對相應配置文件的修改。IIS 7.0中用於控製站點綁定和Web應用針對某個協議的支持的配置文件為applicationHost.config,該配置文件保存的目錄為%windir%\system32\inetsrv\config\。我們可以直接修改這個配置文件來完成我們需要的設置。
存在於applicationHost.config中的如下這段配置就是上麵的命令行執行的結果。三個新增的站點綁定被添加到了表示站點配置節的<bindings>節點中,而表示我們創建的Web應用的<application>節點的enabledProtocols屬性中包含了我們通過命令行設置的四種協議。
1: <configuration>
2: ...
3: <system.applicationHost>
4: ...
5: <sites>
6: ...
7: <site name="Default Web Site" id="1" serverAutoStart="true">
8: ...
9: <application path="/WcfServices" enabledProtocols="http,net.pipe,net.tcp,net.msmq">
10: <virtualDirectory path="/" physicalPath="C:\WcfServices\Service" />
11: </application>
12: <bindings>
13: <binding protocol="http" bindingInformation="*:80:" />
14: <binding protocol="net.tcp" bindingInformation="808:*" />
15: <binding protocol="net.pipe" bindingInformation="*" />
16: <binding protocol="net.msmq" bindingInformation="localhost" />
17: </bindings>
18: </site>
19: </sites>
20: </system.applicationHost>
21: </configuration>
IIS管理器本身提供了可視化的方式是我們很容易地實現對站點綁定的添加、刪除和修改。如圖7-11所示,如果我們在IIS管理器中選擇相應的站點,在右邊“編輯網站”一欄會出現一個“綁定…”按鈕。點擊該按鈕會出現一個“網站綁定”的對話框,當前站點的所有綁定會在這個對話框中列表。我們可以編輯和刪除現有的站點綁定,也可以添加新的站點綁定。IIS管理器隻提供了針對站點綁定的設置,為站點中具體某個Web應用開啟或者關閉某種協議的支持還得需要通過上麵兩種方式來完成。
為作為WCF服務宿主的Web應用和它所在的站點進行了如上的設置之後,我們就可以直接將基於HTTP的終結點綁定直接替換成基於其他協議類型的綁定。下麵配置片斷所示的客戶端終結點采用了NetTcpBinding,而地址代表部署在宿主Web應用的.svc文件地址。
1: <configuration>
2: <system.serviceModel>
3: <client>
4: <endpoint name="calculatorservice"
5: address="net.tcp://localhost/WcfServices/CalculatorService.svc"
6: binding="netTcpBinding"
7: contract="Artech.WcfServices.Service.Interface.ICalculator"/>
8: </client>
9: </system.serviceModel>
10: </configuration>
微信公眾賬號:大內老A
微博:www.weibo.com/artech
如果你想及時得到個人撰寫文章以及著作的消息推送,或者想看看個人推薦的技術資料,可以掃描左邊二維碼(或者長按識別二維碼)關注個人公眾號(原來公眾帳號蔣金楠的自媒體將會停用)。
本文版權歸作者和博客園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁麵明顯位置給出原文連接,否則保留追究法律責任的權利。
最後更新:2017-10-26 14:34:24