ASP.NET Core Web程式托管到Windows 服務

来源:https://www.cnblogs.com/yyfh/archive/2020/01/11/12179818.html
-Advertisement-
Play Games

前言 在 ".NET Core 3.1和WorkerServices構建Windows服務" 我們也看到了,如何將workerservices構建成服務,那麼本篇文章我們再來看看如何將web應用程式托管到我們的服務中. 將WEB應用作為服務運行 我們需要將我們的WEB應用程式編譯成exe文件,在AS ...


前言

.NET Core 3.1和WorkerServices構建Windows服務 我們也看到了,如何將workerservices構建成服務,那麼本篇文章我們再來看看如何將web應用程式托管到我們的服務中.

將WEB應用作為服務運行

我們需要將我們的WEB應用程式編譯成exe文件,在ASP.NETCore中其實這是一個很簡單的過程,我們只需要修改.csproj即可。正如下麵代碼片段


<Project Sdk="Microsoft.NET.Sdk.Web">
  <PropertyGroup>
    <TargetFramework>netcoreapp3.1</TargetFramework>
    <OutputType>Exe</OutputType>
  </PropertyGroup>
</Project>

我們只需要添加OutputType即可.

接著來我們需要安裝Microsoft.Extensions.Hosting.WindowsServices到我們的WEB應用程式中,如下所示:


Install-Package Microsoft.Extensions.Hosting.WindowsServices

現在我們需要在Program.cs中的CreateDefaultBuilder方法中進行擴展UseWindowsService


    public class Program
    {
        public static void Main(string[] args)
        {
            CreateHostBuilder(args).Build().Run();
        }

        public static IHostBuilder CreateHostBuilder(string[] args) =>
            Host.CreateDefaultBuilder(args)
                .ConfigureWebHostDefaults(webBuilder =>
                {
                    webBuilder.UseStartup<Startup>();
                }).UseWindowsService();
    }

上述代碼中我們已經操作完了....

部署服務

我們還需要做的是部署到我們的服務中.

以管理員身份打開命令提示符,然後在項目文件夾中運行以下命令以發佈項目:

dotnet publish -c Release

接下來,我們可以使用標準Windows服務命令將exe作為服務安裝。因此,將命令提示符移動到輸出文件夾(可能沿著myproject\bin\Release\netcoreapp3.1\publish)。並運行類似的內容以作為服務安裝:

sc create ASPNETCoreWindowsService binPath=ASPNETCoreWindowsService.exe

當然我們也可以停止和刪除該服務

sc.exe stop ASPNETCoreWindowsService 
sc.exe delete ASPNETCoreWindowsService 

獨立部署

將Web App作為Windows服務運行的全部原因是,我們不必在電腦上安裝其他工具。但這隻有在我們進行所謂的獨立部署時才有效。這意味著我們將應用程式所需的一切部署在發佈文件夾中,而不必在目標電腦上安裝.NET Core運行時。

我們需要做的就是運行我們的dotnet release命令,其中包含一些額外的標誌:

dotnet publish -c Release -r win-x64 --self-contained

這告訴.NET Core SDK我們要以獨立形式發佈,並且適用於Windows。

您的輸出路徑將從bin\Release\netcoreapp3.0\publish 更改為\bin\Release netcoreapp3.0\win-x64\publish

您還將註意到此新輸出目錄中的大量文件以及該文件夾的一般大小。但是,考慮到這一點,是的,我們正在部署整個運行時,因此它應該很大。

Content Root

我快速瀏覽了UseWindowsService的調用在此處的實際源代碼。我註意到的是,它專門為在Windows Service下運行的內容設置了根目錄。我想知道如果以Windows服務運行時從應用程式內的磁碟讀取本地文件怎麼辦?通常我只會寫類似:

File.ReadAllText("myfile.json");

但是……顯然,在WindowsService上下文中運行時有一些特殊之處。所以我嘗試了一下,我的程式異常了。我不得不檢查機器上的事件查看器,發現:

Exception Info: System.IO.FileNotFoundException: Could not find file 'C:\WINDOWS\system32\myfile.json'.

因此,當作為Windows服務運行時,我的應用程式的"根"認為它位於System32內。再次查看Microsoft的源代碼可以找到解決方案。我可以簡單地使用它們設置內容根目錄的相同方法,以從正確的位置載入我的文件:


File.ReadAllText(Path.Combine(AppContext.BaseDirectory, "myfile.json"));

Reference

https://github.com/hueifeng/BlogSample/tree/master/src/ASPNETCoreWindowsService

https://dotnetcoretutorials.com/2019/12/21/hosting-an-asp-net-core-web-app-as-a-windows-service-in-net-core-3/


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

-Advertisement-
Play Games
更多相關文章
  • 添加或取消 Ctrl + Shift + 對應的數字(1 9) 作用 相當於標簽,Ctrl + 對應的數字鍵,可以快速定位到做了標簽的代碼行 ...
  • 有queryset:A和B 要合併它們,根據網上的答案,貌似是用itertools庫的chain對象比較好,地址 c=chain(x,y) 但是當c用於分頁的時候,就有問題,會報chain沒有len屬性,當試圖給c賦len屬性的時候不成功。 但是,可以這樣 A和B是查詢queryset a=[] a ...
  • 貪婪演算法 貪心演算法(Greedy Algorithm) 簡介貪心演算法,又名貪婪法,是尋找最優解問題的常用方法,這種方法模式一般將求解過程分成若幹個步驟,但每個步驟都應用貪心原則,選取當前狀態下最好/最優的選擇(局部最有利的選擇),並以此希望最後堆疊出的結果也是最好/最優的解。{看著這個名字,貪心,貪 ...
  • 使用Webmagic爬蟲實現的簽名檔一鍵生成 實現原理 這裡爬取的網址是http://jiqie.zhenbi.com/c/ 然後獲取到裡面提交數據,提交地址,在對這些數據進行Post提交 解析html標簽獲得圖片地址並輸出到控制台 不會使用Webmagic爬蟲框架的 自行百度配置 本文主要是學習P ...
  • docker發佈遇到的兩個問題 1:Could not resolve CoreCLR path. For more details, enable tracing by setting COREHOST_TRACE environment variable to 1 2:Error:An asse ...
  • 微信公眾號: "Dotnet9" ,網站: "Dotnet9" ,問題或建議: "請網站留言" , 如果對您有所幫助: "歡迎贊賞" 。 C WPF聊天界面(3/3) 閱讀導航 1. 本文背景 2. 代碼實現 3. 本文參考 1.本文背景 系列文章最後一篇,一個完整的聊天界面。當然只看效果,具體的項 ...
  • 微信公眾號: "Dotnet9" ,網站: "Dotnet9" ,問題或建議: "請網站留言" , 如果對您有所幫助: "歡迎贊賞" 。 C WPF簡況(2/3) 閱讀導航 1. 本文背景 2. 代碼實現 3. 本文參考 1.本文背景 承接上文( "C WPF聯繫人列表(1/3)" ),添加好友簡況 ...
  • 微信公眾號: "Dotnet9" ,網站: "Dotnet9" ,問題或建議: "請網站留言" , 如果對您有所幫助: "歡迎贊賞" 。 C WPF聯繫人列表(1/3) 閱讀導航 1. 本文背景 2. 代碼實現 3. 本文參考 1.本文背景 聊天軟體大家用的比較多,用WPF做個聯繫人列表試試 本文效 ...
一周排行
    -Advertisement-
    Play Games
  • 前言 在我們開發過程中基本上不可或缺的用到一些敏感機密數據,比如SQL伺服器的連接串或者是OAuth2的Secret等,這些敏感數據在代碼中是不太安全的,我們不應該在源代碼中存儲密碼和其他的敏感數據,一種推薦的方式是通過Asp.Net Core的機密管理器。 機密管理器 在 ASP.NET Core ...
  • 新改進提供的Taurus Rpc 功能,可以簡化微服務間的調用,同時可以不用再手動輸出模塊名稱,或調用路徑,包括負載均衡,這一切,由框架實現並提供了。新的Taurus Rpc 功能,將使得服務間的調用,更加輕鬆、簡約、高效。 ...
  • 順序棧的介面程式 目錄順序棧的介面程式頭文件創建順序棧入棧出棧利用棧將10進位轉16進位數驗證 頭文件 #include <stdio.h> #include <stdbool.h> #include <stdlib.h> 創建順序棧 // 指的是順序棧中的元素的數據類型,用戶可以根據需要進行修改 ...
  • 前言 整理這個官方翻譯的系列,原因是網上大部分的 tomcat 版本比較舊,此版本為 v11 最新的版本。 開源項目 從零手寫實現 tomcat minicat 別稱【嗅虎】心有猛虎,輕嗅薔薇。 系列文章 web server apache tomcat11-01-官方文檔入門介紹 web serv ...
  • C總結與剖析:關鍵字篇 -- <<C語言深度解剖>> 目錄C總結與剖析:關鍵字篇 -- <<C語言深度解剖>>程式的本質:二進位文件變數1.變數:記憶體上的某個位置開闢的空間2.變數的初始化3.為什麼要有變數4.局部變數與全局變數5.變數的大小由類型決定6.任何一個變數,記憶體賦值都是從低地址開始往高地 ...
  • 如果讓你來做一個有狀態流式應用的故障恢復,你會如何來做呢? 單機和多機會遇到什麼不同的問題? Flink Checkpoint 是做什麼用的?原理是什麼? ...
  • C++ 多級繼承 多級繼承是一種面向對象編程(OOP)特性,允許一個類從多個基類繼承屬性和方法。它使代碼更易於組織和維護,並促進代碼重用。 多級繼承的語法 在 C++ 中,使用 : 符號來指定繼承關係。多級繼承的語法如下: class DerivedClass : public BaseClass1 ...
  • 前言 什麼是SpringCloud? Spring Cloud 是一系列框架的有序集合,它利用 Spring Boot 的開發便利性簡化了分散式系統的開發,比如服務註冊、服務發現、網關、路由、鏈路追蹤等。Spring Cloud 並不是重覆造輪子,而是將市面上開發得比較好的模塊集成進去,進行封裝,從 ...
  • class_template 類模板和函數模板的定義和使用類似,我們已經進行了介紹。有時,有兩個或多個類,其功能是相同的,僅僅是數據類型不同。類模板用於實現類所需數據的類型參數化 template<class NameType, class AgeType> class Person { publi ...
  • 目錄system v IPC簡介共用記憶體需要用到的函數介面shmget函數--獲取對象IDshmat函數--獲得映射空間shmctl函數--釋放資源共用記憶體實現思路註意 system v IPC簡介 消息隊列、共用記憶體和信號量統稱為system v IPC(進程間通信機制),V是羅馬數字5,是UNI ...