Background Schedule Process job
ส่วนนี้จะรวบรวม Library ที่ใช้ในการทำงานเบื้องหลังโดยอัตโนมัติตามเวลาที่กำหนด
Hangfire
สามารถทำงานร่วมกับ .Net Blazor Server ได้อย่างดี เนื่องจากถูกออกแบบมาให้อยู่ในรูปแบบ middleware ที่เริ่มทำงานและ keep alive ไปกับ process ของแอปพลิเคชัน และสามารถเรียกใช้ Method ที่มีอยู่แล้วบนแอปพลิเคชันที่พัฒนาด้วย Blazor Server โดยยังมีจุดเด่นดังนี้
-
Cross Platform สามารถ Deploy ได้ทั้ง Windows, Linux, และ Container
-
สามารถทำงานร่วมกับฐานข้อมูลได้หลากหลาย
-
มี Dashboard สำหรับมอนิเตอร์การทำงาน
-
ใช้งานได้ฟรี
การติดตั้ง Hangfire และใช้งานร่วมกับ Blazor Server สามารถทำได้ตามขั้นตอนดังต่อไปนี้
เพิ่มแพ็กเกจ Hangfire ในโปรเจกต์ Blazor Server โดยใช้คำสั่งต่อไปนี้ใน Package Manager Console หรือ .NET CLI
dotnet add package Hangfire
เพิ่มคำสั่งในไฟล์ Startup.cs ที่ ConfigureServices ดังนี้ (ตัวอย่างเชื่อมต่อกับฐานข้อมูล PostgresQL)
services.AddHangfire(config =>
{
config.UsePostgreSqlStorage(Configuration.GetConnectionString("PostgresQL"));
});
services.AddHangfireServer();
เพิ่มคำสั่งที่ Configure เพื่อเปิดใช้งานส่วนแสดงผล Dashbord ดังนี้ (ตัวอย่างมีการตั้งค่าตรวจสอบสิทธิการเข้าถึง Dashbord)
app.UseHangfireDashboard("/hangfire", new DashboardOptions
{
Authorization = new[] { new HangfireAuthorizationFilter() }
});
ทำการเพิ่ม RecurringJob ได้ด้วยคำสั่งดังตัวอย่าง
RecurringJob.AddOrUpdate(
() => commonService.CleanEmptyRecords(), Cron.Daily);
จากคำสั่งด้านบนจะเป็นการเพิ่ม Jobs โดยกำหนด Cron.Daily เพื่อทำงานวันละครั้ง โดยเมื่อเริ่มทำงานจะเรียกใช้ commonService.CleanEmptyRecords() ซึ่งเป็นตัวอย่างการใช้งาน Jobs เพื่อลบรายการที่สร้างมาแบบไม่สมบูรณ์ในฐานข้อมูล
ตัวอย่าง Dashbord
สามารถเรียกดู Dashbord ได้จากหน้าเว็บโดยจะอยู่ใน path ที่เรากำหนดโดยจากตัวอย่างจะอยู่ที่ /hangfire ดังภาพ

นอกจากนี้หากต้องการจำกัดสิทธิการเรียกดู Dashbord สามารถทำได้โดยสร้างไฟล์ AuthorizationFilter โดยมีคำสั่งดังนี้
using Hangfire.Dashboard;
public class HangfireAuthorizationFilter : IDashboardAuthorizationFilter
{
public bool Authorize(DashboardContext context)
{
var httpContext = context.GetHttpContext();
return httpContext.User.Identity?.IsAuthenticated ?? false;
}
}
ในส่วนของ User Authenticate สามารถปรับเปลี่ยนให้เหมาะสมกับระบบการยืนยันตัวตนของแอปพลิเคชันเราได้