寄宿wcf服務最常用的環境是iis或者was。在乙個公共架構上建立,它們都提供魯棒性程序控制和生命週期**服務,還有乙個熟悉的管理介面。當iis架構已經在使用時這是對大多數場景來說最合適的解決方案。
然而,也有一些情況你不想在iis或者was中寄宿乙個服務。你可能想顯式控制事件的啟動和停止。或者你可能想提供乙個自定義管理介面而不是使用iis或者was工具。為了實現這個,你可以使用system.servicemodel命名空間中的servicehost類來在任何程式中寄宿乙個服務。當你做這個時,你正在使用乙個自我寄宿的wcf服務。
寄宿乙個wcf服務最常用的場景是在乙個隨系統啟動和停止的windows託管服務中。乙個windows託管服務可能執行在支援wcf的乙個作業系統上,包括windows xp, windows 2003 server, windows vista 或者windows server 2008. 這在這一章的」在乙個windows 託管服務中自我寄宿」中詳細介紹。
另外乙個寄宿服務的場景是在乙個桌面應用程式中,使用winforms(win 窗體程式)或者wpf(windows presentation framework,windows 呈現架構)或者乙個命令列控制台應用程式。服務可以使用對等網,使用乙個廣泛使用的位址以便於其他客戶端可以給它傳送訊息,或者以一些其他方式來宣傳它的位址。如果服務使用乙個一致的佇列作為傳輸協議,訊息可以傳送給服務即便客戶端沒有在執行。乙個一致的佇列,由msmq實現或者是乙個相關資料庫的表,是客戶端和服務端實現通訊的非常好的結構;客戶端和服務端可能臨時是彼此斷開的。
實現乙個自我寄宿服務是非常容易的。列表7.1列出了三個步驟。宿主,是建立servicehost物件並呼叫它的open方法的程式,負責保持可用直到需要關閉的時候。當建立servicehost時有一些選項,比如從**獲取服務基位址和是否建立乙個單例,但也就是如此。
第一章的列表1.1 和1.2 描述了乙個自我寄宿的服務最少需求。這些列表顯示了乙個可以在乙個服務的控制台或者在乙個管理員的桌面執行的自我寄宿的控制台應用。
在乙個windows 託管服務中自我寄宿
windows託管服務時可以由服務控制管理器(service control manager, scm)控制的作業系統程序。使用微軟管理控制台服務(microsoft management console, mmc)管理它們, 但是windows 裝置管理(window management instrumentation, wmi)和scm apis 讓它們對其他控制工具和指令碼程式都可以使用。通過這些工具你可以控制很多特性,比如是否它們隨作業系統自我啟動以及它們執行時的windows 身份。windows 服務是乙個企業應用比如microsoft sql server 和microsoft exchange 的寄宿環境。
windows 託管服務基礎,可以在使用win32 apis的非託管**和繼承自system.serviceprocess命名空間的servicebase類的託管**中訪問,提供了乙個基本的管理介面但是沒有為你的**做任何關於實際寄宿,擴充套件,安全和可信賴的工作。你負責完成所有的通訊(msmq, 命名管道和tcp等等)和執行緒,例項以及控制流。幸運的是,這些特性在wcf中實現了,所有當你在乙個windows服務中寄宿乙個wcf服務時,這些已經為你做好了。
visual studio 有乙個內建的定義windows 服務的模板。當從這個模板建立乙個工程時,基本有乙個靜態main() 負責啟動你的服務以及乙個你可以放你的**的繼承自servicebase的類。基本**需要在兩個步驟完成: 新增wcf servicehost類例項化你的服務並使用scm註冊服務。
首先,你需要新增**到onstart方法來開始處理接收到的訊息。在引入wcf之前,這是你需要建立執行緒池,***和乙個**結構,所有的典型設定都不能使用配置檔案。但是通過使用wcf,所有你需要在onstart方法中做的是建立servicehost並開啟監聽。使用eventlog來記錄一條啟動訊息也是有幫助的。
其次,你需要實現乙個projectinstaller, 在system.configuration.install命名空間中定義和引用。projectinstaller類用來在目標機器安裝託管服務。你可以在乙個安裝程式中做這個或者你可以把它加入到服務本身。為了安裝服務,接下來你需要使用installutil.exe例項來使用scm註冊服務。在執行例項以後,服務已經準備通過scm執行。
列表7.9顯示了完全實現的windows服務。
列表7.9 寄宿在乙個windows服務中wcf服務
using system.componentmodel;
using system.configuration.install;
using system.serviceprocess;
using system.servicemodel;
using system.servicemodel.description;
namespace essentialwcf
}[servicecontract]
public inte***ce istockservice
public class stockservice : istockservice
}public partial class service : servicebase
protected override void onstart(string args)
protected override void onstop()}}
7.5 顯示了當effectivewcf服務啟動時的服務控制管理器的截圖。
WCF 第七章 寄宿 在IIS7中寄宿服務
iis6在windows 2003和windows xp sp2中存在,應用程式池作為乙個執行時容器來寄宿應用程式。這允許對啟動和關閉的控制,在每乙個程序的基礎上進行身份認證和 服務。它原本就提供了跨應用程式的程序隔離功能,這個功能帶來了很大的可信賴性。總的來說程序管理是由應用程式池架構處理的。ii...
WCF 第七章 寄宿 在乙個程序中寄宿多個服務
將應用程式功能聚集到正確的服務層次是系統設計的乙個必須元素。建立乙個有很多介面的系統,這個系統也會變得很令人迷惑。建立只有很多介面的乙個系統,這個系統會是變成乙個很難改變的整體。在第二章 契約 我們描述了如何將多個類介面整合到乙個單一的終結點中。這是通過.net介面整合完成的。我們也描述了如何在乙個...
python第七章 python教程(第七章)
字典和集合 字典是python中唯一,乙個對映型別 如何建立乙個字典,如下 dict dict 滲透 網路安全 怎麼理解字典呢?現實生活中的字典可以通過首字母進行查詢要查詢的漢子,python也可以這樣理解,通過 前的元素查詢到冒號後的元素。為什麼說字典是唯一乙個對映型別呢?看圖。對映型別區別與序列...