天天看點

WCF技術剖析之三:如何進行基于非HTTP的IIS服務寄宿

TCPListener|TCP Listener Adapter NamedPipes Listener|Named Pipes Listener Adapter MSMQ Listener|MSMQ Listener Adapter

<a href="http://images.cnblogs.com/cnblogs_com/artech/WindowsLiveWriter/WCFHTTPIIS_12AE6/image_2.png" target="_blank"></a>

WCF技術剖析之三:如何進行基于非HTTP的IIS服務寄宿

圖1 IIS 7總體架構

由于IIS 7在本質上通過WAS(Windows Process Activation Service)實作了非HTTP的請求監聽,我們也可以将這種方式的服務寄宿稱為基于WAS的服務寄宿。在本執行個體中,我們通過IIS 7實作基于TCP的服務寄宿,圖2表示執行個體應用在VS2008種的解決方案結構。其中,Class Library類型的項目Contracts用于定義服務契約;而Services則用于定義具體的服務;Console應用項目Client模拟用戶端。此外,Services對應目錄被映射為IIS相應站點下的某個Web應用,虛拟目錄名稱為WasHostingDemo。

<a href="http://images.cnblogs.com/cnblogs_com/artech/WindowsLiveWriter/WCFHTTPIIS_12AE6/image_4.png" target="_blank"></a>

WCF技術剖析之三:如何進行基于非HTTP的IIS服務寄宿

圖2 基于TCP的IIS服務寄宿執行個體在VS2008中的解決方案結構

步驟一:定義服務契約和服務

本執行個體仍然采用我們熟悉的計算服務的例子,在Contracts項目下,定義了接口ICalculator代表計算服務的服務契約。

在Services項目中,實作了ICalculator接口,提供服務的實作:

和普通基于HTTP的IIS服務寄宿一樣,我們需要為WCF服務建立相應的.SVC文本檔案,該檔案一般僅僅包含一個&lt;%@ ServiceHost%&gt;指令。簡單起見,我僅僅添加了唯一一個必需的Service屬性(Attribute)。我把該檔案命名為CalculatorService.svc,下面是該.SVC的全部内容:

然後,将Services所在的目錄映射為IIS下的虛拟目錄。在本例中,在IIS 7的Default Web Site站點下,建立了一個命名為WasHostingDemo的Web應用,并将其實體位址指定為Services項目所在的目錄。然後在根目錄下建立一個Web.config,配置WCF服務寄宿相關的設定。整個WCF配置如下,Binding類型指定為NetTcpBinding。

注:由于ASP.NET應用在運作的時候預設從根目錄下的Bin子目錄加載Assembly,而Services項目預設編譯的目标目錄為Bin\Debug|Release,是以我們需要通過修改項目屬性将編譯的目标目錄設為Bin。

步驟二:為站點設定TCP綁定,為Web應用添加支援協定

進行非HTTP的服務寄宿是WAS為WCF提供的最顯著的特性。由于在預設的情況下,IIS僅僅支援對于HTTP請求的處理,我們需要相應的方式對IIS相關配置進行相關的修改,進而改變IIS預設的請求處理行為。在上面我們說過,IIS 7.0廣泛采用了基于XML檔案的配置方式,是以最終極的方式就是直接修改相應的配置檔案。但是,直接修改配置檔案的方式,出錯的頻率很高,對于很多的配置,我們都可以直接通過IIS管理器進行相應的修改。此外,我們可以選擇通過指令行的方式修改相應的配置,IIS為我們提供了一系列的指令。

WAS的配置儲存在配置檔案applicationHost.config中,該檔案儲存在%windir%\system32\inetsrv\config目錄中。為了實作基于非HTTP的服務寄宿,首先需要做的是為WCF Service的寄宿應用所在的Web Site添加非相應非HTTP協定的站點綁定(site binding),該操作可以通過執行Appcmd.exe命名實作,該命名存放在%windir%\system32\inetsrv\目錄中。

為了使寄宿WCF服務的Web站點具有基于TCP的監聽能力,我們可以通過下面的命名行為該站點(Default Web Site)添加基于TCP的綁定,指定監聽端口為808(預設端口)。

站點綁定添加于修改也可以直接通過IIS管理器進行:選擇相應站點=〉在右邊的部分“Bindings”=〉在彈出的Site Bindings對話框中可以添加新的站點綁定和編輯現有的站點綁定,如圖3所示。

<a href="http://images.cnblogs.com/cnblogs_com/artech/WindowsLiveWriter/WCFHTTPIIS_12AE6/image_6.png" target="_blank"></a>

WCF技術剖析之三:如何進行基于非HTTP的IIS服務寄宿

圖3 通過IIS管理器設定站點綁定

在站點級别非HTTP綁定存在的情況下,你還可在應用級别控制對非HTTP協定的支援。在預設的情況下,Web應用并不提供對非HTTP協定的支援,你需要通過AppCmd.exe為應用添加對于某個非HTTP協定支援的能力。通過下面的配置對預設站點下的WasHostingDemo應用添加了對net.tcp支援的能力。

步驟三:建立用戶端程式進行服務調用

對于調用非HTTP協定的IIS寄宿服務的用戶端來說,和普通的WCF服務調用完全一樣,下面是服務調用代碼和相關的配置。由于,用戶端程式通過通路WCF服務的.SVC檔案的方式進行服務的調用,是以在相應終結點中的位址為.SVC所在的位址。

通過運作用戶端程式,你将得到如下的輸出:

本文版權歸作者和部落格園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接配接,否則保留追究法律責任的權利。