diff --git a/HangfireExample.WebService/Extensions/HangfireExtension.cs b/HangfireExample.WebService/Extensions/HangfireExtension.cs new file mode 100644 index 0000000..013efbe --- /dev/null +++ b/HangfireExample.WebService/Extensions/HangfireExtension.cs @@ -0,0 +1,31 @@ +using Hangfire; +using Hangfire.Storage.SQLite; + +namespace HangfireExample.WebService.Extensions +{ + /// + /// Hangfire 的擴充方法。 + /// + public static class HangfireExtension + { + /// + /// 加入 Hangfire 服務。 + /// + /// + /// + public static IServiceCollection AddHangfire(this IServiceCollection services) + { + // 將 Hangfire 加入服務,使用 SQLite 作為儲存區 + services.AddHangfire(configuration => configuration + .UseSQLiteStorage("HangfireExample.db")); + return services; + } + + public static WebApplication UseHangfireDashboard(this WebApplication app, IConfiguration configuration) + { + // HangfireDashboard 預設路由為 /Hangfire + app.UseHangfireDashboard(configuration.GetValue("DashboardRoot")); + return app; + } + } +} diff --git a/HangfireExample.WebService/HangfireExample.WebService.csproj b/HangfireExample.WebService/HangfireExample.WebService.csproj new file mode 100644 index 0000000..e5635c9 --- /dev/null +++ b/HangfireExample.WebService/HangfireExample.WebService.csproj @@ -0,0 +1,19 @@ + + + + net8.0 + enable + enable + + + + + + + + + + + + + diff --git a/HangfireExample.WebService/HangfireExample.db b/HangfireExample.WebService/HangfireExample.db new file mode 100644 index 0000000..237a782 Binary files /dev/null and b/HangfireExample.WebService/HangfireExample.db differ diff --git a/HangfireExample.WebService/Program.cs b/HangfireExample.WebService/Program.cs new file mode 100644 index 0000000..def69f6 --- /dev/null +++ b/HangfireExample.WebService/Program.cs @@ -0,0 +1,29 @@ +using HangfireExample.WebService.Extensions; + +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(); + +builder.Services.AddHangfire(); + +var app = builder.Build(); + +// Configure the HTTP request pipeline. +if (app.Environment.IsDevelopment()) +{ + app.UseSwagger(); + app.UseSwaggerUI(); +} + +app.UseAuthorization(); + +app.MapControllers(); + +app.UseHangfireDashboard(builder.Configuration); + +app.Run(); diff --git a/HangfireExample.WebService/Properties/launchSettings.json b/HangfireExample.WebService/Properties/launchSettings.json new file mode 100644 index 0000000..5c3f504 --- /dev/null +++ b/HangfireExample.WebService/Properties/launchSettings.json @@ -0,0 +1,31 @@ +{ + "$schema": "http://json.schemastore.org/launchsettings.json", + "iisSettings": { + "windowsAuthentication": false, + "anonymousAuthentication": true, + "iisExpress": { + "applicationUrl": "http://localhost:1922", + "sslPort": 0 + } + }, + "profiles": { + "http": { + "commandName": "Project", + "dotnetRunMessages": true, + "launchBrowser": true, + "launchUrl": "swagger", + "applicationUrl": "http://localhost:5185", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + }, + "IIS Express": { + "commandName": "IISExpress", + "launchBrowser": true, + "launchUrl": "swagger", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + } + } +} diff --git a/HangfireExample.WebService/appsettings.Development.json b/HangfireExample.WebService/appsettings.Development.json new file mode 100644 index 0000000..0c208ae --- /dev/null +++ b/HangfireExample.WebService/appsettings.Development.json @@ -0,0 +1,8 @@ +{ + "Logging": { + "LogLevel": { + "Default": "Information", + "Microsoft.AspNetCore": "Warning" + } + } +} diff --git a/HangfireExample.WebService/appsettings.json b/HangfireExample.WebService/appsettings.json new file mode 100644 index 0000000..e1258a6 --- /dev/null +++ b/HangfireExample.WebService/appsettings.json @@ -0,0 +1,10 @@ +{ + "Logging": { + "LogLevel": { + "Default": "Information", + "Microsoft.AspNetCore": "Warning" + } + }, + "AllowedHosts": "*", + "DashboardRoot": "/hangfire" +} diff --git a/HangfireExample.sln b/HangfireExample.sln index 9805579..0bf0005 100644 --- a/HangfireExample.sln +++ b/HangfireExample.sln @@ -3,13 +3,15 @@ Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio Version 17 VisualStudioVersion = 17.9.34607.119 MinimumVisualStudioVersion = 10.0.40219.1 -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HangfireExample", "HangfireExample\HangfireExample.csproj", "{5FF0CD69-D107-4F03-96EF-876BE9D5DA23}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "HangfireExample", "HangfireExample\HangfireExample.csproj", "{5FF0CD69-D107-4F03-96EF-876BE9D5DA23}" EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "方案項目", "方案項目", "{A3B14127-2240-45B0-9441-386F1812E004}" ProjectSection(SolutionItems) = preProject README.md = README.md EndProjectSection EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HangfireExample.WebService", "HangfireExample.WebService\HangfireExample.WebService.csproj", "{EAEFE8DF-8A3D-4909-9A7C-85E9C6D8555C}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -20,6 +22,10 @@ Global {5FF0CD69-D107-4F03-96EF-876BE9D5DA23}.Debug|Any CPU.Build.0 = Debug|Any CPU {5FF0CD69-D107-4F03-96EF-876BE9D5DA23}.Release|Any CPU.ActiveCfg = Release|Any CPU {5FF0CD69-D107-4F03-96EF-876BE9D5DA23}.Release|Any CPU.Build.0 = Release|Any CPU + {EAEFE8DF-8A3D-4909-9A7C-85E9C6D8555C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {EAEFE8DF-8A3D-4909-9A7C-85E9C6D8555C}.Debug|Any CPU.Build.0 = Debug|Any CPU + {EAEFE8DF-8A3D-4909-9A7C-85E9C6D8555C}.Release|Any CPU.ActiveCfg = Release|Any CPU + {EAEFE8DF-8A3D-4909-9A7C-85E9C6D8555C}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/HangfireExample/Program.cs b/HangfireExample/Program.cs index 7cde91c..05417a7 100644 --- a/HangfireExample/Program.cs +++ b/HangfireExample/Program.cs @@ -1,5 +1,4 @@ using Hangfire; -using Hangfire.SqlServer; using Hangfire.Storage.SQLite; // 第三方擴充: Hangfire.Storage.SQLite 0.4.1 @@ -7,5 +6,10 @@ GlobalConfiguration .Configuration .UseSQLiteStorage("HangfireExample.db"); +// Client 加入一個排程任務 +BackgroundJob.Enqueue(() => Console.WriteLine("Hello, world!")); +// Server 啟動 Hangfire 執行排程任務 +using var server = new BackgroundJobServer(); +Console.ReadKey(); \ No newline at end of file diff --git a/README.md b/README.md index 7fb5e23..3f891f1 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,7 @@ # Getting Started ## Storage + Hangfire 會將所有相關資訊會被序列化後保存到儲存區,如類型、方法或參數等。 儲存模型官方預設有以下幾種 @@ -46,7 +47,7 @@ Hangfire 會將所有相關資訊會被序列化後保存到儲存區,如類 資料來源日期: 2024/03/12 ``` -// Version 1.8 +// Hangfire 1.8 GlobalConfiguration .Configuration .SetDataCompatibilityLevel(CompatibilityLevel.Version_180) @@ -54,7 +55,7 @@ GlobalConfiguration .UseRecommendedSerializerSettings() .UseSqlServerStorage("Database=Hangfire.Sample; Integrated Security=True;"); -// Version 1.7 +// Hangfire 1.7 GlobalConfiguration .Configuration .SetDataCompatibilityLevel(CompatibilityLevel.Version_170)