詳解.NET Core中的Worker Service
當(dāng)你想到ASP.NET Core時(shí),可能會(huì)想到Web應(yīng)用程序后端代碼,包括MVC和WebAPI。MVC視圖和Razor頁(yè)面還允許使用后端代碼生成帶有HTML元素的前端UI。全新的Blazor更進(jìn)一步,允許使用WebAssembly在Web瀏覽器中運(yùn)行客戶端.NET代碼。最后,我們現(xiàn)在有了一個(gè)Worker Service應(yīng)用程序的模板。
這是在ASP.NET Core早期預(yù)覽中引入的。雖然項(xiàng)目模板最初列在Web模板下,但此后在向?qū)е兄匦露ㄎ涣艘粋€(gè)級(jí)別。這是在.NET Core中創(chuàng)建長(zhǎng)時(shí)間運(yùn)行的跨平臺(tái)服務(wù)的好方法。本文介紹Windows操作系統(tǒng)。
Worker Service項(xiàng)目
在VisualStudio 2019中創(chuàng)建新的Worker Service項(xiàng)目的最快方法是使用最新模板。還可以使用適當(dāng)?shù)腄otNetCLI命令。
啟動(dòng)VisualStudio并選擇Worker Service模板,如下所示:
要使用命令行,使用以下命令,-o是一個(gè)可選標(biāo)志,用于為項(xiàng)目提供輸出文件夾名:
dotnet new worker -o myproject
程序和后臺(tái)服務(wù)
Program.cs類包含Main()方法和CreateHostBuilder()方法。這可以在下面的片段中看到:
public class Program { public static void Main(string[] args) { CreateHostBuilder(args).Build().Run(); } public static IHostBuilder CreateHostBuilder(string[] args) => Host.CreateDefaultBuilder(args) .UseWindowsService() .ConfigureServices(services => { services.AddHostedService<Worker>(); }); }
要注意的事情:
1. Main方法調(diào)用CreateHostBuilder()方法,并運(yùn)行它。
2. 在ASP.NET Core中,WebHostBuilder將被Generic HostBuilder替代。
3. CreateHostBuilder()創(chuàng)建主機(jī)并通過(guò)調(diào)用AddHostService<T>
Worker.cs,定義如下:
public class Worker : BackgroundService { // ... protected override async Task ExecuteAsync(CancellationToken stoppingToken) { // do stuff here } }
要注意的事情:
1. Worker類實(shí)現(xiàn)BackgroundService 類,它來(lái)自命名空間Microsoft.Extensions.Hoting
2. 然后,Worker類可以重寫ExecuteAsync()方法來(lái)執(zhí)行任何長(zhǎng)期運(yùn)行的任務(wù)。
Worker Service 中使用Logging
若要在Worker Service項(xiàng)目中使用日志記錄,可以在Program.cs:
using Microsoft.Extensions.Logging; public static IHostBuilder CreateHostBuilder(string[] args) => Host.CreateDefaultBuilder(args) .UseWindowsService() .ConfigureLogging(loggerFactory => loggerFactory.AddEventLog()) .ConfigureServices(services => { services.AddHostedService<Worker>(); });
1.在使用擴(kuò)展方法之前,將其NuGet包添加到項(xiàng)目中:
Microsoft.Extensions.Logging.EventLog
2.將適當(dāng)?shù)拿臻g添加到代碼中:
using Microsoft.Extensions.Logging;
3.調(diào)用方法ConfigreLogging()并調(diào)用適當(dāng)?shù)娜罩居涗浄椒?,例如:AddEventLog()。
- AddConsole()
- AddDebug()
- AddEventLog()
- AddEventSourceLogger()
這個(gè)Worker類通過(guò)注入ILogger<Work>對(duì)象到構(gòu)造函數(shù)中:
private readonly ILogger<Worker> _logger; public Worker(ILogger<Worker> logger) { _logger = logger; }
運(yùn)行Worker Service
在繼續(xù)之前,請(qǐng)將調(diào)用添加把UseWindowsService()添加到Program類或者確認(rèn)它已經(jīng)在那里了。官方文檔中UseServiceBaseLifetime()在預(yù)覽版中。在新的版本此方法已重命名為UseWindowsService()中。
public static IHostBuilder CreateHostBuilder(string[] args) => Host.CreateDefaultBuilder(args) .UseWindowsService() .ConfigureServices(services => { services.AddHostedService<Worker>(); });
根據(jù)代碼文檔,UseWindowsService()進(jìn)行下列工作:
1. 將主機(jī)生存期設(shè)置為WindowsServiceLifetime
2. 設(shè)置 ContentRoot
3. 啟用以應(yīng)用程序名稱作為默認(rèn)名稱的事件日志記錄。
你可以以各種方式運(yùn)行Worker Service:
1.在VisualStudio中生成和調(diào)試/運(yùn)行。
2.發(fā)布到exe文件并運(yùn)行它
3.運(yùn)行sc(從Windows\System 32)創(chuàng)建新服務(wù)
若要將Worker Service發(fā)布為具有依賴關(guān)系的exe文件,請(qǐng)運(yùn)行以下命令:
dotnet publish -o C:\path\to\project\pubfolder
-o參數(shù)可用于指定要生成已發(fā)布文件的文件夾的路徑。它可以是指向項(xiàng)目文件夾的路徑,然后是一個(gè)新的子文件夾名,以保存已發(fā)布的文件。
若要?jiǎng)?chuàng)建新服務(wù),請(qǐng)運(yùn)行sc.exe從System 32文件夾中傳入從發(fā)布命令生成的exe文件的名稱。
> C:\Windows\System32\sc create MyServiceName binPath=C:\path\to\project\pubfolder\MyProjectName.exe
當(dāng)手動(dòng)運(yùn)行服務(wù)時(shí),你將看到以下的日志輸出:
info: WorkerServiceSample.Worker[0] Making doc 1 at: 06/09/2019 00:09:52 -04:00Making your document... info: WorkerServiceSample.Worker[0] Making doc 2 at: 06/09/2019 00:10:05 -04:00Making your document... info: Microsoft.Hosting.Lifetime[0] Application started. Press Ctrl+C to shut down. info: Microsoft.Hosting.Lifetime[0] Hosting environment: Development
服務(wù)安裝完成后,會(huì)出現(xiàn)在Windows的服務(wù)列表中:
以上就是詳解.NET Core中的Worker Service的詳細(xì)內(nèi)容,更多關(guān)于.NET Core中的Worker Service的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
使用CustomValidator自定義驗(yàn)證控件檢查是否有對(duì)ListBox控件選擇
在網(wǎng)頁(yè)前端處,我們放置ListBox控件,在數(shù)據(jù)提交前,檢查用戶是否有對(duì)此控件進(jìn)行選擇?小編將介紹使用Javascript與CustomValidator自定義驗(yàn)證控件來(lái)檢查感興趣的朋友可以了解下2013-01-01詳細(xì)介紹.NET中的動(dòng)態(tài)編譯技術(shù)
這篇文章詳細(xì)介紹了.NET中的動(dòng)態(tài)編譯技術(shù),有需要的朋友可以參考一下2013-11-11Linq to SQL Delete時(shí)遇到問(wèn)題的解決方法
在Linq to SQL中要?jiǎng)h除一行記錄,官方的例子教我這樣做2008-03-03用存儲(chǔ)過(guò)程向數(shù)據(jù)庫(kù)存值的具體實(shí)現(xiàn)
本文為大家介紹下使用存儲(chǔ)過(guò)程向數(shù)據(jù)庫(kù)存值的具體實(shí)現(xiàn)過(guò)程,感興趣的朋友不要錯(cuò)過(guò)2014-01-01asp.net使用H5新特性實(shí)現(xiàn)異步上傳的示例
下面小編就為大家分享一篇asp.net使用H5新特性實(shí)現(xiàn)異步上傳的示例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-01-01Visual Studio 2013+OpenCV2.4.10環(huán)境搭建教程
這篇文章主要為大家詳細(xì)介紹了Visual Studio 2013+OpenCV2.4.10環(huán)境搭建教程,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-01-01asp.net 繼承自Page實(shí)現(xiàn)統(tǒng)一頁(yè)面驗(yàn)證與錯(cuò)誤處理
一直以來(lái),我都在思考以前一個(gè)項(xiàng)目中,后臺(tái)文件中很多的.aspx文件上的權(quán)限判斷問(wèn)題,傻乎乎的我基本上每個(gè)文件當(dāng)時(shí)都給加了一句2009-04-04