WCF學習之旅—WCF服務的Windows 服務程式寄宿(十一)

来源:http://www.cnblogs.com/chillsrc/archive/2016/05/24/5523490.html
-Advertisement-
Play Games

上接 WCF學習之旅—WCF服務部署到IIS7.5(九) WCF學習之旅—WCF服務部署到應用程式(十) 七 WCF服務的Windows 服務程式寄宿 這種方式的服務寄宿,和IIS一樣有一個一樣的優點,系統啟動後,WCF服務也會跟著啟動了,不用人工干預,也是一種較好的寄宿方式。 (1) 在解決方案下 ...


上接    WCF學習之旅—WCF服務部署到IIS7.5(九)

          WCF學習之旅—WCF服務部署到應用程式(十)

 

七 WCF服務的Windows 服務程式寄宿

       這種方式的服務寄宿,和IIS一樣有一個一樣的優點,系統啟動後,WCF服務也會跟著啟動了,不用人工干預,也是一種較好的寄宿方式。

      (1) 在解決方案下新建控制台輸出項目 WinServiceHosting。如下圖。

    

    (2)添加 System.ServiceModel.dll 的引用。

    (3)添加 WCF 服務類庫(WcfServiceLib)的項目引用。

    (4) 添加響應的Window服務類。如下圖。

    

    (5)然後在服務類啟動裡面添加WCF的寄宿代碼,如下所示。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Linq;
using System.ServiceModel;
using System.ServiceProcess;
using System.Text;
using System.Threading.Tasks; 

namespace WinSvrviceHosting
{
    partial class WCFServiceMgr : ServiceBase
    {
        string Name = "WCF服務Windows Service寄宿";
        public WCFServiceMgr()
        {

            InitializeComponent();
            this.ServiceName = Name;
        }

        protected override void OnStart(string[] args)
        {
            // TODO: 在此處添加代碼以啟動服務。

            try
            {
                svrHost = new ServiceHost(typeof(WCFServiceMgr));
                if (svrHost.State != CommunicationState.Opened)
                {
                    svrHost.Open();
                }
            }

            catch (Exception ex)
            {
                Logger.Log(ex,string.Empty,string.Empty,string.Empty);

            }

            Logger.Log(Name + DateTime.Now.ToShortTimeString() + "已成功調用了服務一次。");
            Logger.Log(Name + "已成功啟動。");
        }

        protected override void OnStop()
        {
            // TODO: 在此處添加代碼以執行停止服務所需的關閉操作。
            if (svrHost!=null)
            {
                svrHost.Close();
                svrHost = null;

            }
        }

        private static object syncRoot = new Object();//同步鎖
        private ServiceHost svrHost = null; //寄宿服務對象 

    } 

}

 

         (6) 在WCFServiceMgr.cs的設計界面上右鍵,在彈出菜單中選擇“添加安裝程式”。如下圖1。這時,項目里會自動生成一個ProjectInstaller.cs文件。如下圖2。

 

 圖1

 

圖2

 

        ( 7) 選中serviceInstaller1,打開它的屬性視圖,修改屬性。如下圖所示:

 

       (8) 接著選中serviceProcessInstaller1,打開它的屬性視圖,修改屬性。如下圖:(這裡服務賬號也可以是其他的。)

 

 

       (9) 為了實現通過該控制台程式實現參數化安裝和卸載服務,我們需要攔截控制台的參數,併進行相應的操作,如下所示。

using System;
using System.Collections.Generic;
using System.Configuration.Install;
using System.Linq;
using System.ServiceProcess;
using System.Text;
using System.Threading.Tasks; 

namespace WinSvrviceHosting

{

    class Program

    {
        static void Main(string[] args)
        {

            ServiceController service = new ServiceController(WCFServiceMgr.Name);           

            // 運行服務

            if (args.Length == 0)
            {

                ServiceBase[] ServicesToRun;
                ServicesToRun = new ServiceBase[] { new WCFServiceMgr() };
                ServiceBase.Run(ServicesToRun);
            }

            else if (args[0].ToLower() == "/i" || args[0].ToLower() == "-i")
            {

                #region 安裝服務

                if (!IsServiceExisted("WCFServiceMgr"))
                {
                    try

                    {

                        string[] cmdline = { };

                        string serviceFileName = System.Reflection.Assembly.GetExecutingAssembly().Location;
                        TransactedInstaller transactedInstaller = new TransactedInstaller();
                        AssemblyInstaller assemblyInstaller = new AssemblyInstaller(serviceFileName, cmdline);
                        transactedInstaller.Installers.Add(assemblyInstaller);

                        transactedInstaller.Install(new System.Collections.Hashtable());
                        TimeSpan timeout = TimeSpan.FromMilliseconds(1000 * 10);
                        service.Start();                        service.WaitForStatus(ServiceControllerStatus.Running, timeout);
                    }

                    catch (Exception ex)
                    {                        Logger.Log(ex,string.Empty,string.Empty,string.Empty);
                        throw ex;

                    }
                }

                #endregion

            }
            else if (args[0].ToLower() == "/u" || args[0].ToLower() == "-u")

            {

                #region 刪除服務

                try
                {

                    if (IsServiceExisted("WCFServiceMgr"))
                    {

                        string[] cmdline = { };
                        string serviceFileName = System.Reflection.Assembly.GetExecutingAssembly().Location; 

                        TransactedInstaller transactedInstaller = new TransactedInstaller();
                        AssemblyInstaller assemblyInstaller = new AssemblyInstaller(serviceFileName, cmdline);
                        transactedInstaller.Installers.Add(assemblyInstaller);
                        transactedInstaller.Uninstall(null);
                    }
                }

                catch (Exception ex)
                {
                    Logger.Log(ex, string.Empty, string.Empty, string.Empty);
                    throw ex;
                }
                #endregion
            } 

        }

        #region 檢查服務存在的存在性 

        /// <summary> 
        /// 檢查服務存在的存在性 
        /// </summary> 
        /// <param name=" NameService ">服務名</param> 
        /// <returns>存在返回 true,否則返回 false;</returns> 
        public static bool IsServiceExisted(string NameService)
        {
            ServiceController[] services = ServiceController.GetServices();
            foreach (ServiceController s in services)
            {
                if (s.ServiceName.ToLower() == NameService.ToLower())
                {
                    return true;
                }
            }
            return false;
        }

        #endregion

    }

}

 

 

       (10)添加應用程式配置文件App.config,這次我們使用配置的方式進行WCF服務的公佈,WCF服務配置代碼如下。

<?xml version="1.0" encoding="utf-8" ?>

<configuration>

    <startup>

        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5.2" />

    </startup> 

  <system.serviceModel>   

    <diagnostics>

      <messageLogging logEntireMessage="true" logKnownPii="false" logMalformedMessages="true"
        logMessagesAtServiceLevel="true" logMessagesAtTransportLevel="true" />
      <endToEndTracing propagateActivity="true" activityTracing="true"

        messageFlowTracing="true" />
    </diagnostics>

    <behaviors>
      <serviceBehaviors>
        <behavior name="metadataBehavior">
          <serviceMetadata httpGetEnabled="true" httpGetUrl="http://127.0.0.1:8080/BookService/metadata" />
          <serviceDebug includeExceptionDetailInFaults="True" />
        </behavior>

      </serviceBehaviors>
    

    </behaviors>

    <services>

      <service behaviorConfiguration="metadataBehavior" name="WcfServiceLib.BookService">

        <endpoint address="http://127.0.0.1:8080/BookService" binding="wsHttpBinding"

        contract="WcfServiceLib.IBookService" />

      </service>

    </services>

  </system.serviceModel>

</configuration>

 

        (11) 編譯程式成功後,我們添加兩個批處理的DOS腳本來實現執行程式的自動安裝和卸載,如下所示。

--安裝腳本

"WinSvrviceHosting.exe" -i

pause

 

--卸載腳本

"WinSvrviceHosting.exe" -u

Pause

(12) 我們首先執行安裝腳本。結果如下圖。

 

        (13) 順利執行腳本後,“管理工具—》服務”,在服務列表裡面就增加一個服務項目了。如下圖。

 

        (14) 執行卸載腳本,腳本就會卸載服務。如下圖。

 

 

   建立客戶端

      使用我們在Console寄宿程式編寫的客戶端,去訪問Windows窗體宿主程式的WCF服務。

 

 

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • Insus.NET開發這樣多網站,客戶一直沒有這個要求。不過,現在有客戶有這樣的要求了。線上用戶訪問人數,也就是說,要為網站寫一個計數器,計數器的初始值為0,網站一開始運行時(Application_Start),就開始統計,當有用戶訪問時(Session_Start)計數器加1,當用戶訪問離開時( ...
  • 三大範式一直沒有記住,看了這個有了理解!挺好的記著,以後忘了,可以再看看! 為了建立冗餘較小、結構合理的資料庫,設計資料庫時必須遵循一定的規則。在關係型資料庫中這種規則就稱為範式。範式是符合某一種設計要求的總結。要想設計一個結構合理的關係型資料庫,必須滿足一定的範式。 在實際開發中最為常見的設計範式 ...
  • 環境:Vs2103(TFS2013) 目的:去掉別人項目里的TFS控制,因為每次打開時會有提示信息 解決方法: 1.刪除隱藏的.$tf文件夾,搜索*.vssscc和*.vspscc這兩個尾碼的文件,刪除找到的文件. 2.使用文本編輯器打開*.sln文件,找到 GlobalSection(TeamFo ...
  • 剛到新單位,學習他們的源代碼,代碼里讀寫系統配置文件的XML代碼比較老套,直接寫在一個系統配置類里,沒有進行類的拆分,造成類很龐大,同時,操作XML的讀寫操作都是使用SetAttribute和node.Attribute(name)方法,因此,想到結合之前所做的XML操作,完成了一個能夠讀取XML文 ...
  • 寫入: 插入100萬條數據:用InsertMany,耗時16s左右。 讀取: 讀取300萬條數據,耗時3600毫秒。 ...
  • ...
  • 這次要分享的是C#Task任務的幾個列子,感覺最實用的是封裝的分頁任務執行方法,這個方法步奏也是目前在我工作中執行多任務常用的,不知道各位也有這用的情況,那麼開始吧。 1.順序任務執行 1 //順序任務執行 2 Task.Factory.StartNew<int>(() => { Console.W ...
  • 關於面試中涉及到的事件的問題,我們只需要抓住幾個關鍵點就好了: 定義事件: 5 } ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...