国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Asp.net core Webapi 如何執(zhí)行定時(shí)任務(wù)?

這篇具有很好參考價(jià)值的文章主要介紹了Asp.net core Webapi 如何執(zhí)行定時(shí)任務(wù)?。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

Asp.net core Webapi 如何執(zhí)行定時(shí)任務(wù)?

前言

在計(jì)算機(jī)系統(tǒng)中,定時(shí)執(zhí)行一些后臺(tái)任務(wù)是很常見的場(chǎng)景,比如定時(shí)發(fā)送郵件、備份數(shù)據(jù)等等。

那么,.NET 技術(shù)如何通過編程靈活地實(shí)現(xiàn)項(xiàng)目里復(fù)雜的自定義任務(wù)呢?

如果是 Windows 生態(tài),通常來說,可以有這些方式:

  1. 編寫一個(gè)程序,通過 Windows 內(nèi)置的任務(wù)計(jì)劃來定時(shí)執(zhí)行。
  2. 編寫一個(gè)程序,通過 Windows 內(nèi)置的 Services 來定時(shí)執(zhí)行。
  3. 編寫一個(gè)定時(shí)循環(huán)執(zhí)行任務(wù)的程序,在 Windows 系統(tǒng)啟動(dòng)時(shí)配置為自動(dòng)執(zhí)行。
    ……

但是,如果是一個(gè)中小型的 Web 應(yīng)用系統(tǒng),這些方法方式就顯得不太合適。Asp.net core Webapi 有沒有辦法執(zhí)行定時(shí)任務(wù)呢?答案是有的,Asp.net core Webapi 可以通過常駐后臺(tái)的托管服務(wù)來執(zhí)行定時(shí)任務(wù)。

本文是 Asp.net core Webapi 運(yùn)行一個(gè)常駐后臺(tái)并從數(shù)據(jù)庫中導(dǎo)出數(shù)據(jù)的托管服務(wù)的例子,寫出來供大家指點(diǎn),在討論過程中共同提高水平。

Step By Step 實(shí)現(xiàn)步驟

  1. 創(chuàng)建一個(gè) asp.net core webapi 項(xiàng)目
  2. 從 Nuget 安裝以下包

    Microsoft.AspNetCore.Identity.EntityFrameworkCore
    Microsoft.EntityFrameworkCore.Relational
    Microsoft.EntityFrameworkCore.SqlServer
    Microsoft.EntityFrameworkCore.Tools

  3. 打開 appsettings.json 并添加數(shù)據(jù)庫連接字符串,如:
    {
      "Logging": {
    	"LogLevel": {
    	  "Default": "Information",
    	  "Microsoft.AspNetCore": "Warning"
    	}
      },
      "AllowedHosts": "*",
      "ConnectionStrings": {
    	"Default": "Server=(localdb)\\mssqllocaldb;Database=IdentityTestDB;Trusted_Connection=True;MultipleActiveResultSets=true"
      }
    }
    
  4. 添加一個(gè)繼承于 IdentityUser 的 User 類
    using Microsoft.AspNetCore.Identity;
    
    public class User: IdentityUser<long>
    {
    	public DateTime CreationTime { get; set; }
    	public string? NickName { get; set; }
    }	
    
  5. 添加一個(gè)繼承于 IdentityRole 的 Role 類
    using Microsoft.AspNetCore.Identity;
    
    public class Role: IdentityRole<long>
    {
    
    }
    
  6. 創(chuàng)建數(shù)據(jù)庫上下文
    using Microsoft.AspNetCore.Identity.EntityFrameworkCore;
    using Microsoft.EntityFrameworkCore;
    
    public class TestDbContext: IdentityDbContext<User, Role, long>
    {
    	public TestDbContext(DbContextOptions<TestDbContext> options):base(options)
    	{
    
    	}
    
    	protected override void OnModelCreating(ModelBuilder builder)
    	{
    		base.OnModelCreating(builder);
    		builder.ApplyConfigurationsFromAssembly(this.GetType().Assembly);
    	}
    }	
    
  7. 創(chuàng)建一個(gè) ExplortStatisticBgService 類并繼承 BackgroundService,這是托管服務(wù)類
    using Microsoft.EntityFrameworkCore;
    using System.Text;
    
    public class ExplortStatisticBgService : BackgroundService
    {
    	private readonly TestDbContext ctx;
    	private readonly ILogger<ExplortStatisticBgService> logger;
    	private readonly IServiceScope serviceScope;
    
    	/// <summary>
    	/// 在構(gòu)造方法注入IServiceScopeFactory服務(wù),
    	/// 用來創(chuàng)建IServiceScope對(duì)象,
    	/// 這樣就可以通過IServiceScope來創(chuàng)建短生命周期的服務(wù)了
    	/// </summary>
    	/// <param name="scopeFactory"></param>
    	public ExplortStatisticBgService(IServiceScopeFactory scopeFactory)
    	{
    		this.serviceScope = scopeFactory.CreateScope();
    		var sp = serviceScope.ServiceProvider;
    		this.ctx = sp.GetRequiredService<TestDbContext>();
    		this.logger = sp.GetRequiredService<ILogger<ExplortStatisticBgService>>();  
    	}
    
    	protected override async Task ExecuteAsync(CancellationToken stoppingToken)
    	{
    		// 用 while 循環(huán)實(shí)現(xiàn)服務(wù)常駐
    		while (!stoppingToken.IsCancellationRequested)
    		{
    			// 用 try...catch 捕捉異常記錄錯(cuò)誤信息并避免方法退出
    			try
    			{
    				// 這里實(shí)現(xiàn)每隔5秒從數(shù)據(jù)庫中導(dǎo)出數(shù)據(jù)
    				// 更復(fù)雜的配置可以用第三方開源的框架
    				await DoExecuteAsync();
    				await Task.Delay(5000);
    			}
    			catch (Exception ex)
    			{
    				logger.LogError(ex, "獲取用戶統(tǒng)計(jì)數(shù)據(jù)失敗");
    				await Task.Delay(1000);
    			}
    		}
    	}
    
    	private async Task DoExecuteAsync()
    	{
    		var items = ctx.Users.AsNoTracking().GroupBy(u => u.CreationTime.Date)
    			.Select(e => new 
    			{ 
    				Date = e.Key,
    				Count = e.Count()
    			});
    		StringBuilder sb = new StringBuilder(1024);
    		sb.AppendLine($"Date: {DateTime.Now}");
    		foreach (var item in items)
    		{
    			sb.Append(item.Date).AppendLine($": {item.Count}");
    		}
    		await File.WriteAllTextAsync("d:/1.txt", sb.ToString());
    		logger.LogInformation($"導(dǎo)出完成");
    	}
    
    	/// <summary>
    	/// IServiceScope 需要釋放
    	/// 所以重寫 Dispose 方法
    	/// </summary>
    	public override void Dispose()
    	{
    		base.Dispose();
    		serviceScope.Dispose();
    	}
    }	
    
  8. 打開 Program.cs,注入托管服務(wù)等,看代碼的注釋
    using Microsoft.AspNetCore.Identity;
    using Microsoft.EntityFrameworkCore;
    
    var builder = WebApplication.CreateBuilder(args);
    
    // Add services to the container.
    
    builder.Services.AddControllers();
    // Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
    builder.Services.AddEndpointsApiExplorer();
    builder.Services.AddSwaggerGen();
    
    IServiceCollection services = builder.Services;
    
    // 注冊(cè)托管服務(wù)
    services.AddHostedService<ExplortStatisticBgService>();
    
    // 注入數(shù)據(jù)庫上下文
    services.AddDbContext<TestDbContext>(options => {
    	string connStr = builder.Configuration.GetConnectionString("Default")!;
    	options.UseSqlServer(connStr);
    });
    
    // 數(shù)據(jù)保護(hù)服務(wù)注入
    // ----數(shù)據(jù)保護(hù)提供了一個(gè)簡單、基于非對(duì)稱加密改進(jìn)的加密API用于確保Web應(yīng)用敏感數(shù)據(jù)的安全存儲(chǔ)
    // ----不需要開發(fā)人員自行生成密鑰,它會(huì)根據(jù)當(dāng)前應(yīng)用的運(yùn)行環(huán)境,生成該應(yīng)用獨(dú)有的一個(gè)私鑰
    services.AddDataProtection();
    
    // 注入 Identity 框架的一些重要的基礎(chǔ)配置
    // 如果沒有這個(gè),下面的注入 UserManager 等服務(wù)會(huì)有問題,程序無法編譯
    services.AddIdentityCore<User>(options =>
    {
    	options.Password.RequireDigit = false;
    	options.Password.RequireLowercase = false;
    	options.Password.RequireNonAlphanumeric = false;
    	options.Password.RequireUppercase = false;
    	options.Password.RequiredLength = 6;
    	options.Tokens.PasswordResetTokenProvider = TokenOptions.DefaultEmailProvider;
    	options.Tokens.EmailConfirmationTokenProvider = TokenOptions.DefaultEmailProvider;
    });
    
    // 注入 UserManager、RoleManager 等Identity 框架服務(wù)
    var idBuilder = new IdentityBuilder(typeof(User), typeof(Role), services);
    idBuilder.AddEntityFrameworkStores<TestDbContext>()
    	.AddDefaultTokenProviders()
    	.AddRoleManager<RoleManager<Role>>()
    	.AddUserManager<UserManager<User>>();
    
    var app = builder.Build();
    
    // Configure the HTTP request pipeline.
    if (app.Environment.IsDevelopment())
    {
    	app.UseSwagger();
    	app.UseSwaggerUI();
    }
    
    app.UseHttpsRedirection();
    
    app.UseAuthorization();
    
    app.MapControllers();
    
    app.Run();
    ``
    
  9. Ctrl+F5 運(yùn)行項(xiàng)目,不做任何操作,托管程序會(huì)自動(dòng)導(dǎo)出數(shù)據(jù)

擴(kuò)展

托管服務(wù)在后臺(tái)運(yùn)行,通過它可以實(shí)現(xiàn)在很多事情,比如:文章來源地址http://www.zghlxwxcb.cn/news/detail-760677.html

  1. 監(jiān)控消息隊(duì)列,當(dāng)有數(shù)據(jù)進(jìn)入消息隊(duì)列就處理。
  2. 再如每隔10s把A數(shù)據(jù)庫中的數(shù)據(jù)同步到B數(shù)據(jù)庫中
  3. ...... 等等

到了這里,關(guān)于Asp.net core Webapi 如何執(zhí)行定時(shí)任務(wù)?的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • ASP.NET Core SingleR Core:WebApi + .net 客戶端開發(fā)

    ASP.NET Core SingleR Core:WebApi + .net 客戶端開發(fā)

    我之前稍微研究了一下SignalR Core。用起來還行。簡單來說SignalR就是用來解決實(shí)時(shí)通訊的問題的。 ASP.NET Core SingleR:初次體驗(yàn)和簡單項(xiàng)目搭建 SignalR支持三種客戶端,C#,Java,JavaScirpt?;緣蛴昧恕1旧砭褪俏④涢_發(fā)的,肯定支持自己的語言。因?yàn)槭荳ebsocket的上層封裝,所以也要支

    2024年01月20日
    瀏覽(557)
  • .net 溫故知新【14】:Asp.Net Core WebAPI  緩存

    .net 溫故知新【14】:Asp.Net Core WebAPI 緩存

    緩存指在中間層中存儲(chǔ)數(shù)據(jù)的行為,該行為可使后續(xù)數(shù)據(jù)檢索更快。 從概念上講,緩存是一種性能優(yōu)化策略和設(shè)計(jì)考慮因素。 緩存可以顯著提高應(yīng)用性能,方法是提高不常更改(或檢索成本高)的數(shù)據(jù)的就緒性。 在最新的緩存控制規(guī)范文件RFC9111中,詳細(xì)描述了瀏覽器緩存和

    2024年02月05日
    瀏覽(89)
  • Asp.NET Core WebAPI 入門學(xué)習(xí)筆記,超詳細(xì)

    Asp.NET Core WebAPI 入門學(xué)習(xí)筆記,超詳細(xì)

    WebAPI 是一種傳統(tǒng)的方式,用于構(gòu)建和暴露 RESTUI風(fēng)格的Web服務(wù)。它提供了豐富的功能和靈活性,可以處理各種HTTP請(qǐng)求,并支持各種數(shù)據(jù)格式,如JSON、XML等。 WebAPI使用控制器(Controllers)和動(dòng)作方法(ActionMethods)的概念、通過路由配置將請(qǐng)求映射到相應(yīng)的方法上。 開發(fā)人員可以使用

    2024年04月24日
    瀏覽(94)
  • ASP.NET core WebApi Cors跨域解決

    ASP.NET core WebApi Cors跨域解決

    我用了最新版的Asp.net webapi ,在csdn上面搜跨域如何解決的時(shí)候,發(fā)現(xiàn)csdn上面對(duì)于.NET技術(shù)討論不是很多。沒辦法,只能面向官方文檔和GitHub編程了。 前面兩個(gè)已經(jīng)放棄維護(hù)了,我們就不用了。用最新的webApi 我們引入了最新的api后可以在官方網(wǎng)址上查看文檔(有些地址是gitH

    2024年04月29日
    瀏覽(93)
  • ASP.NET Core如何知道一個(gè)請(qǐng)求執(zhí)行了哪些中間件?

    ASP.NET Core如何知道一個(gè)請(qǐng)求執(zhí)行了哪些中間件?

    需要添加兩個(gè)Nuget包分別是: Microsoft.AspNetCore.MiddlewareAnalysis 和 Microsoft.Extensions.DiagnosticAdapter ,前者是分析記錄中間件核心代碼實(shí)現(xiàn)后者是用來接收日志輸出的,由于是用的DiagnosticSource方式記錄日志,所以需要使用DiagnosticListener對(duì)象的SubscribeWithAdapter方法來訂閱。 這個(gè)適配器

    2023年04月09日
    瀏覽(98)
  • .net 溫故知新【17】:Asp.Net Core WebAPI  中間件

    .net 溫故知新【17】:Asp.Net Core WebAPI 中間件

    到這篇文章為止,關(guān)于.NET \\\"溫故知新\\\"系列的基礎(chǔ)知識(shí)就完結(jié)了,從這一系列的系統(tǒng)回顧和再學(xué)習(xí),對(duì)于.NET core、ASP.NET CORE又有了一個(gè)新的認(rèn)識(shí)。 不光是從使用,還包括這些知識(shí)點(diǎn)的原理,雖然深入原理談不上,但對(duì)于日常使用也夠了,我想的是知其然,知其所以然。 在實(shí)際

    2024年01月18日
    瀏覽(92)
  • ASP.NET CORE WEBAPI 登錄 JWT 鑒權(quán) ,接口權(quán)限驗(yàn)證

    介紹 當(dāng)今Web開發(fā)中,API的使用越來越廣泛,而API的安全性也變得越來越重要。其中,JWT(JSON Web Token)鑒權(quán)和授權(quán)是一種常見的解決方案。 本篇文章將會(huì)介紹JWT鑒權(quán)和授權(quán)的原理、實(shí)現(xiàn)方式以及注意事項(xiàng)。 什么是JWT? JWT是一種基于JSON格式的開放標(biāo)準(zhǔn)(RFC7519),用于在網(wǎng)絡(luò)

    2023年04月21日
    瀏覽(84)
  • .net 溫故知新【11】:Asp.Net Core WebAPI 入門使用及介紹

    .net 溫故知新【11】:Asp.Net Core WebAPI 入門使用及介紹

    在Asp.Net Core 上面由于現(xiàn)在前后端分離已經(jīng)是趨勢(shì),所以asp.net core MVC用的沒有那么多,主要以WebApi作為學(xué)習(xí)目標(biāo)。 我使用的是VS2022, .Net 7版本。 在創(chuàng)建界面有幾項(xiàng)配置: 配置Https 啟用Docker 使用控制器 啟用OpenAPI支持 不使用頂級(jí)語句 其中配置Https 是WebApi是否使用https協(xié)議,啟

    2024年02月07日
    瀏覽(86)
  • 前后端分離,Asp.net core webapi 簡單 2 步,輕松配置跨域

    前后端分離,Asp.net core webapi 簡單 2 步,輕松配置跨域

    可以說,前后端分離已經(jīng)成為當(dāng)今信息系統(tǒng)項(xiàng)目開發(fā)的主流軟件架構(gòu)模式,微服務(wù)的出現(xiàn),讓前后端分離發(fā)展更是迅速,大量優(yōu)秀的前端框架如 vue.js、react 的出現(xiàn),也讓前后端分離趨勢(shì)加快。 所謂的前后端分離軟件架構(gòu)模式,就是指將前端和后端的開發(fā)完全分離,后端負(fù)責(zé)

    2024年01月17日
    瀏覽(14)
  • ASP.NET Core 8.0 WebApi 從零開始學(xué)習(xí)JWT登錄認(rèn)證

    ASP.NET Core 8.0 WebApi 從零開始學(xué)習(xí)JWT登錄認(rèn)證

    我一起寫后端Api我都是直接裸連的,但是現(xiàn)在為了規(guī)范一些,我還是打算上一個(gè)JWT功能 ASP.NET Web API 2系列(四):基于JWT的token身份認(rèn)證方案 Jwt-dotnet github 選好了模板,就進(jìn)去看看號(hào)了,42M的下載量已經(jīng)很高了,一般來說,只要超過500k的下載量,基本就是一個(gè)穩(wěn)定的代碼倉庫了

    2024年04月09日
    瀏覽(22)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包