WCF 一步一步發布WCF服務到Windows 服務

來源:互聯網
上載者:User

剛才我們發布了WCF到IIS,下面咱們把WCF,再發布到Windows 服務

WCF是個好東西,對他的讚美之詞的確不少,是微軟無數開發人員的智慧結晶,如果你在學習或者在用WCF,我真的為你感到高興,在我上學的時候想要去解決相容性和平衡效能問題,需要那麼多專業知識和時間,而現在的WCF,只需要簡單的配置就可以實現。

咱們要先用起來是第一步,不落後於時代,不排斥新技術。

如何:在託管 Windows 服務中承載 WCF 服務

本主題概述了建立由 Windows 服務承載的 Windows Communication Foundation (WCF) 服務所需的基本步驟。此方案可通過託管 Windows 服務承載選項啟用,此選項是在沒有訊息啟用的安全環境中在 Internet 資訊服務 (IIS) 外部承載的、長時間啟動並執行 WCF 服務。服務的生存期改由作業系統控制。此宿主選項在 Windows 的所有版本中都是可用的。

可以使用 Microsoft 管理主控台 (MMC) 中的 Microsoft.ManagementConsole.SnapIn 管理 Windows 服務,並且可以將其配置為在系統啟動時自動啟動。此承載選項包括註冊承載 WCF 服務作為託管 Windows 服務的應用程式定義域,因此服務的進程生存期由 Windows 服務的服務控制管理員 (SCM) 來控制。

服務程式碼封裝括服務合約的服務實現、Windows 服務類和安裝程式類。服務實作類別 CalculatorService 是 WCF 服務。CalculatorWindowsService 是 Windows 服務。要符合 Windows 服務的要求,該類繼承自 ServiceBase 並實現 OnStart 和 OnStop 方法。在 OnStart 中,將為 CalculatorService 類型建立 ServiceHost 並開啟它。在 OnStop 中,停止並釋放服務。主機還負責提供服務主機基址,該基址已在應用程式設定中進行設定。安裝程式類繼承自
Installer,允許程式通過 Installutil.exe 工具安裝為 Windows 服務。
構造服務並提供宿主代碼

使用 Service.cs 檔案中的計算機服務介面來定義 ICalculator 服務合約。

通過從 WCF ICalculator 介面繼承,在 Service.cs 檔案的 CalculatorService 類中實現服務合約作為 WCF 服務。

通過從 ServiceBase 類繼承來實現 Windows 服務。重寫 OnStart 方法以建立並開啟 ServiceHost 的執行個體。重寫 OnStop 方法以關閉 ServiceHost 的執行個體。建立 CalculatorService 執行個體的執行個體並將其命名為“WCFWindowsServiceSample”。提供應用程式的進入點。

建立 ProjectInstaller 類,此類繼承自 Installer 並用設定為 true 的 RunInstallerAttribute 來標記,因此,在安裝程式集時將調用 Visual Studio 的自訂動作安裝程式或 Installutil.exe。

在配置中提供服務的基址。
安裝並運行服務

編譯服務以產生 Service.exe 可執行檔。

在命令提示字元處鍵入 installutil bin\service.exe 來安裝 Windows 服務。(如果尚未設定該工具的路徑,則該工具放置在 Microsoft.NET Framework 安裝目錄中。)在命令提示字元處鍵入 services.msc 以訪問服務控制管理員 (SCM)。WINDOWS 服務應作為“WCFWindowsServiceSample”出現在服務中。只有在 Windows 服務正在啟動並執行情況下,WCF 服務才能響應用戶端。若要啟動服務,請在 SCM 中右擊服務並選中“啟動”,或在命令提示字元處鍵入
net start WCFWindowsServiceSample。

如果對服務變更,則必須首先停止並卸載服務。若要停止服務,請在 SCM 中右擊服務並選中“停止”,或在命令提示字元處鍵入 net stop WCFWindowsServiceSample。請注意,如果停止 WINDOWS 服務然後運行用戶端,則在用戶端嘗試訪問服務時發生 EndpointNotFoundException 異常。若要卸載 WINDOWS 服務,請在命令提示字元處鍵入 installutil /u bin\service.exe。
樣本

下面的代碼示範如何將 Service.cs 檔案的內容用於協定、協定的實現以及 WINDOWS 服務安裝和宿主代碼。

與“自承載”選項一樣,Windows 服務主機環境要求寫入一些宿主代碼作為應用程式的一部分。服務作為一個 .exe 程式實現,並包含其自己的宿主代碼。在其他宿主環境(如 Internet 資訊服務 (IIS) 中的 Windows 進程啟用服務 (WAS) 宿主)中,開發人員沒有必要編寫宿主代碼。

 

1:寫在前面

我們都知道WCF在啟動並執行時候必須自己提供宿主來承載服務。WCF 本身沒有附帶宿主,而是提供了一個 ServiceHost 的類,該類允許您在自己的應用程式中host WCF 服務。然後調用 ServiceHost 的 Open 方法即可。我們知道WCF是針對SOA的一套技術.對於SOA而言,我們必須確保服務能夠正常運行,平穩的運行,所以此時如何host我們的服務,用什麼來Host我們的服務是很重要的,所以我們要為我們的應用程式選擇一個合適的Host方式是很有必要的.

2:常見的幾種Host

使用Visual Studio.NET可以建立以下幾種不同類型的託管應用程式:

WinForms 應用程式

控制台應用程式

Windows 服務

承載於 Internet 資訊服務 (IIS) 中的 Web 應用程式

下面我會以一個Demo為例,來介紹這幾種常用的host.

3:Hoster特徵

在選擇應用程式類型時,必須考慮某些特定要求.ServiceHost 必須被執行個體化才能提供運行服務所需的承載環境。控制台應用程式和 WinForms 應用程式通常運行在使用者案頭電腦上。在案頭上是可見的,它們可以承載您的服務,安全性較差.因此並不適用於企業的宿主。因為我們要讓我們的企業服務能夠支援更大更多的服務,在使用控制台應用程式和 WinForms 應用程式作為host的時候,顯然不適合,在這種體繫結構中,。這些適用於企業的宿主通常能夠滿足諸如高可用性的要求。因此,我們不能將控制台或 WinForms 應用程式做為適用於企業的宿主。唯一可行的就是在
IIS 上承載服務或將其Host到Windows 服務。事實上在項目開發過程中我們一般都用windows applicatin或console application做為host.這樣有利於調試和測試,而在項目部署的時候,我們一般會選擇IIS或windows service作為host. IIS有很多優點,他本身提供了很多功能,

4:Soultion結構圖

 

在這個Soultion主要介紹了Console Applicatin,Windows service,IIS三種Host,因為Windows Application和Console Application沒有多大區別,暫不作介紹

首先我們介紹在Windows Services中Host WCF service.Windows service 是由作業系統管理的進程,在.net環境中已經提供了這樣的模板,以Windows services作為host是一個很不錯的選擇:

Windows services Host對應用solution中的WCFWindowsServicesHost.

Services Contract和Services

[ServiceContract]
public interface ITest
{
    [OperationContract]
    double add(double x, double y);
}

public class Test:ITest
{     

      public double add(double x, double y)
      {
          return x + y;
      }

}

5:Windows services Host

首先我們建立一個windows service 項目.

 

windows services項目中包含兩個檔案:service1.cs 檔案和 program.cs 檔案。其中 service1.cs 檔案包含服務實現,而 program.cs 檔案則用於執行個體化並實質上承載 Windows 服務。要在 Windows 服務內部承載 WCF 服務,只需執行 Windows service的 Start() 方法和 Stop() 方法

     ServiceHost host;
      public WindowServiceTest()
      {
          InitializeComponent();
      }

      protected override void OnStart(string[] args)
      {
          host = new ServiceHost(typeof(Test));
          host.Open();          
      }

      protected override void OnStop()
      {
          host.Close();
      }
  設定檔:

<system.serviceModel>
  <behaviors>
    <endpointBehaviors >
      <behavior name="ConsoleApplicationHost">
      </behavior>
    </endpointBehaviors>
  </behaviors>
  <bindings>
    <basicHttpBinding>
      <binding name="basicBinding"></binding>
    </basicHttpBinding>
  </bindings> 
  <services>
    <service name="WCFHostServices.Test">
      <endpoint address="" binding="basicHttpBinding" bindingConfiguration="basicBinding" contract="WCFHostContract.ITest" behaviorConfiguration="ConsoleApplicationHost">
      </endpoint>
      <host>
        <baseAddresses>
          <add baseAddress="http://localhost/WindowsServiceTest"/>
        </baseAddresses>
      </host>
    </service>
  </services>    
</system.serviceModel>

事實我們可以看到編寫host在windows services上的WCF服務很簡單,windows services固然有很多好處,比如說隨作業系統一起啟動,無須人為的開啟,而且不限定你的綁定技術,話說windows service 有這麼多好處,當然也有不好的地方,比如安裝windows service.我們必須通過Installutil.exe 工具或通過安裝包中的自訂動作來安裝服務。這個工具在安裝SDK後會內建的,InstallUtil的使用也很簡單,下面我們以自訂安裝服務為例

 

在 Windows 服務項目中開啟 Service 類的設計器視圖。在右擊視窗中,單擊“添加安裝程式”,這樣我們就會添加了一個名為ProjectInstaller的組件,在項目中雙擊這個檔案,有一個servicesinstall1的組件,我們右擊可以修改他的名字,起動類型等,

 

 

為了建立安裝 Windows 服務的安裝程式,我們需要向solution中添加安裝程式和部署項目(windowsserviceSetup)。以下步驟描述了如何向解決方案添加安裝程式和部署項目:

建立一個安裝項目:

 

1:按右鍵安裝項目,指向“添加”,然後選擇“項目輸出”,選擇windows service appliation...選擇主輸出,

2:按右鍵安裝項目,指向 view->custome action.

 

3:右擊Customer action,將主輸出的檔案加入custome action中

4:產生項目,並安裝,這樣我們就可以啟動我們的servcies裡.我們可以開啟windows services管理工具查看我們安裝後的servcie

 

 

6:IIS Host

若要在 IIS 中host WCF Services,需要有一個副檔名為 .svc 的檔案。事實上在我們項目模板中已經提供了這樣的模板.該檔案將服務與其實現相關聯,並且是 IIS 自動建立 ServiceHost 的手段。IIS 將接管服務與 ServiceHost 之間的互動,不必再由您自己執行個體化和啟動 ServiceHost。.svc 檔案的第一行包含一條夾在 ASP.NET <% Page %> 指令內的指令,用於指示檔案指向哪個服務。在 IIS 中承載 WCF 服務的預設行為是該 IIS 控制 ServiceHost
的執行個體化。

我們可以建立一個WCF Services Application,這個檔案會自動生Service.svc的檔案.

 

我們也可以在其他項目模板中添加svc檔案:

 

<%@ ServiceHost Language="C#" Debug="true" Service="WCFIISHost.Test" CodeBehind="Test.svc.cs" %>

在 IIS 中進行host意味著您必須在應用程式的 Web.config 檔案中設定 WCF 配置。Web.config 如下

<system.serviceModel>
  <services>
    <service behaviorConfiguration="WCFIISHost.Service1Behavior"
      name="WCFIISHost.Test">
      <endpoint address="" binding="wsHttpBinding" contract="WCFIISHost.ITest">
        <identity>
          <dns value="localhost" />
        </identity>
      </endpoint>
      <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
    </service>
  </services>
  <behaviors>
    <serviceBehaviors>
      <behavior name="WCFIISHost.Service1Behavior">
        <!-- To avoid disclosing metadata information, set the value below to false and remove the metadata endpoint above before deployment -->
        <serviceMetadata httpGetEnabled="true"/>
        <!-- To receive exception details in faults for debugging purposes, set the value below to true.  Set to false before deployment to avoid disclosing exception information -->
        <serviceDebug includeExceptionDetailInFaults="false"/>
      </behavior>
    </serviceBehaviors>
  </behaviors>
</system.serviceModel>

在 IIS 中host WCF services的預設行為是該 IIS 控制 ServiceHost 的執行個體化。在Client端我們直接引用地址,預設會在我們的用戶端組建代理程式檔案,無須我們使用svcutil工具來產生用戶端的代理.

注意:endpoint的address應該為空白,以就是說svc 檔案將會確定服務的 base 地址

7:Console Application Host

這種方法再簡單不過了,因為大多數時候在測試專案的時候,我們都會用這樣的host,

Config:

<system.serviceModel>
  <behaviors>
    <endpointBehaviors >
      <behavior name="ConsoleApplicationHost">
      </behavior>
    </endpointBehaviors>
  </behaviors>
  <bindings>
    <basicHttpBinding>
      <binding name="basicBinding"></binding>
    </basicHttpBinding>
  </bindings> 
  <services>
    <service name="WCFHostServices.Test">
      <endpoint address="" binding="basicHttpBinding" bindingConfiguration="basicBinding" contract="WCFHostContract.ITest" behaviorConfiguration="ConsoleApplicationHost">
      </endpoint>
      <host>
        <baseAddresses>
          <add baseAddress="http://localhost/ConsoleTest"/>
        </baseAddresses>
      </host>
    </service>
  </services>    
</system.serviceModel>

啟動Host:

using (ServiceHost host = new ServiceHost(typeof(Test)))
           {
               host.Open();
               Console.WriteLine("Services has begun listenting");
               Console.ReadKey();
           }

Client:

public class CoClient : ClientBase<WCFHostContract.ITest>, ITest
{
    public double add(double x, double y)
    {
        return this.Channel.add(x, y);
    }
}

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.