由於業務中有些任務需要在后台靜默長期運行,或者有些服務隊響應的要求比較苛刻,這樣的WCF服務就不適合寄宿於IIS中。IIS每隔一段時間w3wp進程會閑置超時,造成服務的運行停止,因此這種耗時或者定時任務更加適合以windows服務的形式作為后台進程靜默運行。
- 創建WCF服務相關類庫
首先創建一個類庫程序
在類庫程序中添加WCF服務文件
右鍵選擇添加新建項——在搜索框中輸入WCF——選擇第一個WCFService並重命名為HelloService。
刪除類庫中的App.config配置文件,這個配置文件用不到。修改IHelloService接口中方法的名稱和返回值。默認程序返回值為空不利於我們測試。修改后的代碼如下:
[ServiceContract]
public interface IHelloService
{
[OperationContract]
string DoWork();
}
同時修改接口實現類HelloService中的方法,修改后的代碼如下
public string GetMessage()
{
return "HelloWorld";
}
這樣WCF服務就創建好了,下面接着創建WCF的宿主程序——Windows服務
- 創建Windows服務程序
右鍵選擇解決方案——添加——新建項——選擇Windows Service
創建完成后刪除默認生成的服務類Service1,我們自己創建一個。右鍵選擇HelloService——添加——新建項——選擇Windows Service
創建完成后在服務設計界面上點擊右鍵選擇添加安裝程序,添加服務的安裝選項
添加完成后,需要設置服務的啟動方式和運行賬戶。首先在服務安裝程序的設計界面上右鍵選擇serviceInstallser1——屬性——在右面的屬性對話框中將StartType設置為Automatic
在服務安裝程序設計界面上右鍵選擇serviceProcessInstaller1——屬性——在右邊的屬性對話框中設置Account屬性的值為LocalSystem,如下圖所示
以上設置完成后,修改windows服務程序中Program類中Main方法中要創建的服務實類為WCFServiceHost,否則編譯不過。
這樣服務在安裝啟動以后就會以LocalSystem賬戶的形式在后台自動運行
- 在Windows服務中寄宿WCF服務
1、在windows服務項目中添加System.Service.Model和WCF服務類庫
2、修改配置文件,添加WCF服務相關的配置信息,在<system.serviceModel> </system.serviceModel>節點添加如下配置信息
<system.serviceModel>
<services>
<service name="SimpleService.HelloService">
<!--設置服務節點,服務的地址直接采用基地址,使用basicHttpBinding-->
<endpoint address="" binding="basicHttpBinding" contract="SimpleService.IHelloService">
</endpoint>
<!--設置元數據交換節點-->
<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange">
</endpoint>
<host>
<baseAddresses>
<!--服務的基地址用來訪問獲取元數據-->
<add baseAddress="http://localhost:9013/HelloService"/>
</baseAddresses>
</host>
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior name="HttpGetEnable">
<!--公開元數據,正是部署時候應該去掉防止元數據泄露-->
<serviceMetadata httpGetEnabled="true"/>
<serviceDebug includeExceptionDetailInFaults="true"/>
</behavior>
</serviceBehaviors>
</behaviors>
<bindings>
<basicHttpBinding>
<binding name="NoneSecurity">
<!--取消安全驗證-->
<security mode="None">
</security>
</binding>
</basicHttpBinding>
</bindings>
</system.serviceModel>
3、啟動服務
在服務類中添加如下代碼
OnStart方法為服務啟動時啟動WCF服務,OnStrop方法為服務停止時停止WCF服務。
- 安裝Windows服務
設置完成以后就可以安裝Windows服務,服務生成以后在bin\debug目錄下新建兩個文本文件,一個用來安裝服務,一個用來刪除服務。
Instll.txt里面添加如下代碼:
%SystemRoot%\Microsoft.NET\Framework\v4.0.30319\installutil.exe E:\文檔\visual studio 2013\Projects\20160310WCFWindowsServiceHost\ServiceHost\bin\Debug\ServiceHost.exe
Net Start WCFServiceHost
sc config WCFServiceHost start= auto
pause
UnInstall.txt里面添加如下代碼
%SystemRoot%\Microsoft.NET\Framework\v4.0.30319\installutil.exe /u E:\文檔\visual studio 2013\Projects\20160310WCFWindowsServiceHost\ServiceHost\bin\Debug\ServiceHost.exe
Pause
這兩段代碼的具體含意,
%SystemRoot%\Microsoft.NET\Framework\v4.0.30319\installutil.exe就是調用.net的一個服務安裝程序,來執行服務的安裝和刪除。【.net的安裝程序,默認是裝在系統盤下的那個位置,如果有改變,請更改為具體的路徑】
此段代碼后面跟着的是服務所在的文件夾的路徑和服務的可執行文件。我是放在D盤下的,因此寫D盤下的路徑。可根據需要更改。
Net Start Fanso2o_MonitoringActivity 服務安裝好后,立刻執行服務。
sc config Fanso2o_MonitoringActivity start= auto 設置服務的啟動方式為自動。其實已經在代碼里設置過了,這個地方沒必要。
以上全部改好后,將Install.tex、Uninstall.text兩個文件的后綴名改為bat,就可以執行服務的安裝和刪除了。
【注意一:執行此兩個文件時,需要用管理員權限執行,否則就會報錯。】
【注意二:服務安裝后,請不要改動源代碼重新生成,否則會刪除不掉。如必需改動源代碼,請先刪除服務,刪除后再改動生成,重新安裝】
改好以后以管理員權限運行Install.bat就能成功安裝服務
在服務列表里面查看一下服務狀態
服務已經安裝並啟動成功。在瀏覽器中訪問WCF服務的基地址
使用WCFTestClient測試一下服務是否可用
如圖所示,服務調用成功,證明WCF服務已經部署成功。
- 調試Windows服務
有時候服務有問題我們需要調試,這時候調試Windows服務寄宿的WCF服務就不想普通WCF服務調試那么簡單。
首先將Windows服務啟動以后,以管理員身份運行VS打開服務代碼
確定已經啟動了服務
保證以管理員身份運行VS,打開要調試的代碼
在要調試的代碼上打上斷點,不能調試OnStart方法!
在菜單欄中選擇調試——附加進程——在進程列表中勾選顯示所有用戶進程——找到要調試的服務進程——選擇附加
然后在WCFTestClient中調用WCF服務
這樣就能跟蹤調試代碼了。