跳過到頁腳內容
.NET幫助

Hangfire .NET Core(開發者的工作原理)

現代應用程式開發通常需要處理背景任務以處理巨大的工作負載。 在此類情況下,我們需要能夠執行多個作業的背景作業處理器。 C# .NET Core應用程式的一個此類背景作業處理器是Hangfire。在本文中,我們將學習如何管理Hangfire背景作業以及如何使用其他套件(例如IronPDF for PDF Generation)在背景中生成PDF文件。

Hangfire透過提供一個可靠且靈活的框架來簡化ASP.NET Core或.NET Core 6 Web API應用程式中的背景處理實現,可以管理和執行背景作業。 Hangfire作為NuGet套件提供,可以使用.NET CLI安裝,如下所示:

dotnet add package Hangfire --version 1.8.6

.NET Core Web API中的實作

要學習Hangfire,我們來創建一個簡單的.NET Core API應用程式,並使用CLI安裝Hangfire。

dotnet new webapi -n HangfireDemo
cd HangfireDemo
dotnet build
dotnet add package Hangfire --version 1.8.6
dotnet build
dotnet new webapi -n HangfireDemo
cd HangfireDemo
dotnet build
dotnet add package Hangfire --version 1.8.6
dotnet build
SHELL

這裡我們正在使用.NET CLI創建一個簡單的天氣REST API。 第一行創建了一個名為HangfireDemo的.NET Core Web API項目,以執行API端點。 第二行進入我們新創建的文件夾"HangfireDemo",然後建構該專案。 接下來,我們將Hangfire NuGet包添加到專案中,並再次建構它。 在此之後,您可以在任意編輯器中打開您的專案,例如Visual Studio 2022或JetBrains Rider。 現在,如果您運行項目,可以看到如下所示的Swagger:

Hangfire .NET Core (How It Works For Developer): Figure 1 - Swagger

在這裡我們可以看到天氣GET API,返回日期、摘要和溫度。

Hangfire .NET Core (How It Works For Developer): Figure 2 - Weather GET API

現在讓我們添加一個Hangfire背景作業處理器。 在Visual Studio中打開專案。

添加Hangfire作業處理器

在您的應用程式中配置Hangfire,通常是在Startup.cs文件中。這涉及到設置作業儲存並初始化Hangfire伺服器。

// Startup.cs
using Hangfire;

public class Startup
{
    public void ConfigureServices(IServiceCollection services)
    {
        // Add Hangfire services and use SQL Server as storage option
        services.AddHangfire(config => config.UseSqlServerStorage("your_connection_string"));
        services.AddHangfireServer();
    }

    public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    {
        // Use Hangfire Server and Dashboard for monitoring and managing jobs
        app.UseHangfireServer();
        app.UseHangfireDashboard();
        // Your other configuration settings
    }
}
// Startup.cs
using Hangfire;

public class Startup
{
    public void ConfigureServices(IServiceCollection services)
    {
        // Add Hangfire services and use SQL Server as storage option
        services.AddHangfire(config => config.UseSqlServerStorage("your_connection_string"));
        services.AddHangfireServer();
    }

    public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    {
        // Use Hangfire Server and Dashboard for monitoring and managing jobs
        app.UseHangfireServer();
        app.UseHangfireDashboard();
        // Your other configuration settings
    }
}
$vbLabelText   $csharpLabel

ConfigureServices方法用於添加儲存以保存Hangfire的新建立作業。 此處使用的是SQL Server資料庫。 應將SQL Server連接字串替換為"your_connection_string"。 也可以使用Hangfire.InMemory進行記憶內部儲存。

dotnet add package Hangfire.InMemory --version 0.6.0

然後替換為:

services.AddHangfire(configuration => { configuration.UseInMemoryStorage(); });
services.AddHangfire(configuration => { configuration.UseInMemoryStorage(); });
$vbLabelText   $csharpLabel

創建背景作業

定義您想作為背景作業運行的方法。 這些方法應該是靜態方法或具有無參數建構子的類的實例方法。 作業可以作為定期作業運行,或者您可以同時運行多個作業。

public class MyBackgroundJob
{
    public void ProcessJob()
    {
        // Background job logic, can be a recurring job or multiple jobs
        Console.WriteLine("Background job is running...");
    }
}
public class MyBackgroundJob
{
    public void ProcessJob()
    {
        // Background job logic, can be a recurring job or multiple jobs
        Console.WriteLine("Background job is running...");
    }
}
$vbLabelText   $csharpLabel

入隊作業

使用Hangfire API入隊背景作業。 您可以安排背景作業在特定時間、延遲後或定期運行。

// Enqueue a job to run immediately
BackgroundJob.Enqueue<MyBackgroundJob>(x => x.ProcessJob());

// Schedule a job to run after a 5-minute delay
BackgroundJob.Schedule<MyBackgroundJob>(x => x.ProcessJob(), TimeSpan.FromMinutes(5));

// Schedule a recurring job using a job ID
RecurringJob.AddOrUpdate<MyBackgroundJob>("jobId", x => x.ProcessJob(), Cron.Daily);
// Enqueue a job to run immediately
BackgroundJob.Enqueue<MyBackgroundJob>(x => x.ProcessJob());

// Schedule a job to run after a 5-minute delay
BackgroundJob.Schedule<MyBackgroundJob>(x => x.ProcessJob(), TimeSpan.FromMinutes(5));

// Schedule a recurring job using a job ID
RecurringJob.AddOrUpdate<MyBackgroundJob>("jobId", x => x.ProcessJob(), Cron.Daily);
$vbLabelText   $csharpLabel

Hangfire儀表板和伺服器

可以在Configure方法中添加Hangfire儀表板和伺服器,以進行即時作業監控。

// Run Hangfire server and dashboard
app.UseHangfireServer();
app.UseHangfireDashboard();
// Run Hangfire server and dashboard
app.UseHangfireServer();
app.UseHangfireDashboard();
$vbLabelText   $csharpLabel

伺服器也可以在ConfigureServices中添加。

services.AddHangfireServer();
services.AddHangfireServer();
$vbLabelText   $csharpLabel

一次性作業

// Fire and forget jobs are executed only once and almost immediately after creation.
var jobId = BackgroundJob.Enqueue(() => Console.WriteLine("Fire-and-forget!")); // Job ID for fire and forget job
// Fire and forget jobs are executed only once and almost immediately after creation.
var jobId = BackgroundJob.Enqueue(() => Console.WriteLine("Fire-and-forget!")); // Job ID for fire and forget job
$vbLabelText   $csharpLabel

定期作業

// Recurring jobs fire many times based on a specified CRON schedule.
RecurringJob.AddOrUpdate("myrecurringjob", () => Console.WriteLine("Recurring!"), Cron.Daily);
// Recurring jobs fire many times based on a specified CRON schedule.
RecurringJob.AddOrUpdate("myrecurringjob", () => Console.WriteLine("Recurring!"), Cron.Daily);
$vbLabelText   $csharpLabel

延遲作業

// Delayed jobs are executed only once but after a specified interval.
var jobId = BackgroundJob.Schedule(() => Console.WriteLine("Delayed!"), TimeSpan.FromDays(7));
// Delayed jobs are executed only once but after a specified interval.
var jobId = BackgroundJob.Schedule(() => Console.WriteLine("Delayed!"), TimeSpan.FromDays(7));
$vbLabelText   $csharpLabel

後續作業

// Continuation jobs are executed once their parent jobs have completed.
BackgroundJob.ContinueJobWith(jobId, () => Console.WriteLine("Continuation!"));
// Continuation jobs are executed once their parent jobs have completed.
BackgroundJob.ContinueJobWith(jobId, () => Console.WriteLine("Continuation!"));
$vbLabelText   $csharpLabel

批次作業

// Batch is a group of background jobs created atomically and considered as a single entity.
var batchId = BatchJob.StartNew(x =>
{
    x.Enqueue(() => Console.WriteLine("Job 1"));
    x.Enqueue(() => Console.WriteLine("Job 2"));
});
// Batch is a group of background jobs created atomically and considered as a single entity.
var batchId = BatchJob.StartNew(x =>
{
    x.Enqueue(() => Console.WriteLine("Job 1"));
    x.Enqueue(() => Console.WriteLine("Job 2"));
});
$vbLabelText   $csharpLabel

批次後續作業

// Batch continuation is fired when all background jobs in a parent batch are finished.
BatchJob.ContinueBatchWith(batchId, x =>
{
    x.Enqueue(() => Console.WriteLine("Last Job"));
});
// Batch continuation is fired when all background jobs in a parent batch are finished.
BatchJob.ContinueBatchWith(batchId, x =>
{
    x.Enqueue(() => Console.WriteLine("Last Job"));
});
$vbLabelText   $csharpLabel

儀表板

Hangfire儀表板是您可以找到有關背景作業的所有信息的地方。 它被寫為OWIN中間件(如果您對OWIN不熟悉,不用擔心),因此您可以將其插入到您的ASP.NET、ASP.NET MVC、Nancy和ServiceStack應用程式中,也可以使用OWIN自我託管功能將儀表板託管在控制台應用程式或Windows服務中。

當您啟用了儀表板後,它可以從/hangfire/擴展名訪問。 在此儀表板中,您可以管理背景運行的作業、安排背景作業以及查看一次性作業及其定期作業。 這些作業可以使用作業ID識別。

即時處理

Hangfire .NET Core (How It Works For Developer): Figure 3 - Live Processing of Jobs

成功作業

查看下方成功的作業。

Hangfire .NET Core (How It Works For Developer): Figure 4 - Succeeded Jobs

安排的作業

Hangfire .NET Core (How It Works For Developer): Figure 5 - Scheduled Jobs

當您的應用程式運行時,Hangfire將根據配置的設置負責處理背景作業。

記得檢查Hangfire文檔以獲取更多高級配置選項和功能:Hangfire 文檔,完整代碼可以在GitHub Hangfire Demo上找到。

介紹IronPDF

IronPDF for .NET PDF GenerationNuGet包來自Iron Software的PDF库,可以幫助讀取和生成PDF文檔。 它可以輕鬆地將帶有樣式信息的格式整理文件轉換為PDF。 IronPDF可以輕鬆地從HTML內容生成PDF。 它可以從URL下載HTML,然後生成PDF。

IronPDF的主要吸引力是其HTML到PDF轉換功能,該功能保留佈局和樣式。 它可以從網頁內容中創建PDF,非常適合報告、發票和文件。 此功能支持將HTML文件、URL和HTML字符串轉換為PDF。

using IronPdf;

class Program
{
    static void Main(string[] args)
    {
        var renderer = new ChromePdfRenderer();

        // Convert HTML String to PDF
        var htmlContent = "<h1>Hello, IronPDF!</h1><p>This is a PDF from an HTML string.</p>";
        var pdfFromHtmlString = renderer.RenderHtmlAsPdf(htmlContent);
        pdfFromHtmlString.SaveAs("HTMLStringToPDF.pdf");

        // Convert HTML File to PDF
        var htmlFilePath = "path_to_your_html_file.html"; // Specify the path to your HTML file
        var pdfFromHtmlFile = renderer.RenderHtmlFileAsPdf(htmlFilePath);
        pdfFromHtmlFile.SaveAs("HTMLFileToPDF.pdf");

        // Convert URL to PDF
        var url = "http://ironpdf.com"; // Specify the URL
        var pdfFromUrl = renderer.RenderUrlAsPdf(url);
        pdfFromUrl.SaveAs("URLToPDF.pdf");
    }
}
using IronPdf;

class Program
{
    static void Main(string[] args)
    {
        var renderer = new ChromePdfRenderer();

        // Convert HTML String to PDF
        var htmlContent = "<h1>Hello, IronPDF!</h1><p>This is a PDF from an HTML string.</p>";
        var pdfFromHtmlString = renderer.RenderHtmlAsPdf(htmlContent);
        pdfFromHtmlString.SaveAs("HTMLStringToPDF.pdf");

        // Convert HTML File to PDF
        var htmlFilePath = "path_to_your_html_file.html"; // Specify the path to your HTML file
        var pdfFromHtmlFile = renderer.RenderHtmlFileAsPdf(htmlFilePath);
        pdfFromHtmlFile.SaveAs("HTMLFileToPDF.pdf");

        // Convert URL to PDF
        var url = "http://ironpdf.com"; // Specify the URL
        var pdfFromUrl = renderer.RenderUrlAsPdf(url);
        pdfFromUrl.SaveAs("URLToPDF.pdf");
    }
}
$vbLabelText   $csharpLabel

開始使用IronPDF

安裝IronPDF程式庫

使用NuGet包管理器安裝

要使用NuGet包管理器將IronPDF整合到您的Hangfire .NET項目中,請按照以下步驟操作:

  1. 打開Visual Studio,並在解決方案資源管理器中右鍵單擊您的專案。
  2. 從上下文菜單中選擇"管理NuGet包…"。
  3. 轉到"瀏覽"選項卡並搜索IronPDF。
  4. 從搜索結果中選擇IronPDF程式庫,然後單擊"安裝"按鈕。
  5. 接受任何授權協議提示。

如果您更喜歡使用包管理器控制台,請執行以下命令:

Install-Package IronPdf

這將抓取並安裝IronPDF到您的專案中。

使用NuGet網站安裝

有關IronPDF的詳情概述,包括功能、兼容性和其他下載選項,請訪問NuGet網站上的IronPDF頁面https://www.nuget.org/packages/IronPdf

透過DLL安裝

或者,您可以直接使用其DLL將IronPDF合併到您的專案中。從這裡下載包含DLL的ZIP文件IronPDF直接下載。 解壓縮,然後將DLL包含到您的專案中。

現在讓我們修改應用程式以添加一個背景處理作業來將網站下載為PDF文件。

namespace HangfireDemo.Core;

public class PdfGenerationJob
{
    public void Start(string website)
    {
        // Create a PDF from any existing web page
        ChromePdfRenderer renderer = new ChromePdfRenderer();
        PdfDocument pdf = renderer.RenderUrlAsPdf(website);
        var filePath = AppContext.BaseDirectory + "result.pdf";
        pdf.SaveAs(filePath);
    }
}
namespace HangfireDemo.Core;

public class PdfGenerationJob
{
    public void Start(string website)
    {
        // Create a PDF from any existing web page
        ChromePdfRenderer renderer = new ChromePdfRenderer();
        PdfDocument pdf = renderer.RenderUrlAsPdf(website);
        var filePath = AppContext.BaseDirectory + "result.pdf";
        pdf.SaveAs(filePath);
    }
}
$vbLabelText   $csharpLabel

IronPDF內建了一種方法可以從URL下載網站並將其保存為PDF文件。 我們將在作業中使用此方法來下載並保存到指定位置。 此背景作業可以修改為接收多個網站URL並將其保存為PDF。

現在,讓我們添加一個控制器來公開PDF生成和下載API。

using Hangfire;
using HangfireDemo.Core;
using Microsoft.AspNetCore.Mvc;

namespace HangfireDemo.Controllers;

[ApiController]
[Route("[controller]")]
public class PdfGeneratorController : ControllerBase
{
    [HttpGet("request", Name = "Start PDF Generation")]
    public void Start([FromQuery] string websiteUrl)
    {
        BackgroundJob.Enqueue<PdfGenerationJob>(x => x.Start(websiteUrl));
    }

    [HttpGet("result", Name = "Download PDF Generation")]
    public IActionResult WebResult()
    {
        var filePath = AppContext.BaseDirectory + "result.pdf";
        var stream = new FileStream(filePath, FileMode.Open);
        return new FileStreamResult(stream, "application/octet-stream") { FileDownloadName = "website.pdf" };
    }
}
using Hangfire;
using HangfireDemo.Core;
using Microsoft.AspNetCore.Mvc;

namespace HangfireDemo.Controllers;

[ApiController]
[Route("[controller]")]
public class PdfGeneratorController : ControllerBase
{
    [HttpGet("request", Name = "Start PDF Generation")]
    public void Start([FromQuery] string websiteUrl)
    {
        BackgroundJob.Enqueue<PdfGenerationJob>(x => x.Start(websiteUrl));
    }

    [HttpGet("result", Name = "Download PDF Generation")]
    public IActionResult WebResult()
    {
        var filePath = AppContext.BaseDirectory + "result.pdf";
        var stream = new FileStream(filePath, FileMode.Open);
        return new FileStreamResult(stream, "application/octet-stream") { FileDownloadName = "website.pdf" };
    }
}
$vbLabelText   $csharpLabel

在這裡,我們創建了兩個API:一個用於啟動背景作業並獲取網站URL以開始下載,另一個API用於下載生成的PDF。 這些API如下所示。

Hangfire .NET Core (How It Works For Developer): Figure 7 - PDFGenerator APIs

結果如下所示:

Hangfire .NET Core (How It Works For Developer): Figure 8 - Output

授權(提供免費試用)

要使上述代碼在沒有浮水印的情況下正常運行,需要一個授權金鑰。 免費試用授權可在註冊IronPDF免費試用時提供給開發者。 試用授權不需要信用卡。 您可以提供您的電子郵件ID並註冊免費試用。

結論

Hangfire和IronPDF是一個很好的組合,可以在背景中生成和下載PDF。 Hangfire可以有效處理長時間運行的任務,而IronPDF提供了一個靈活且易於使用的PDF生成解決方案。 要了解有關IronPDF的更多信息,您可以訪問IronPDF文檔

還可以探索Iron Software產品套件中的其他工具,這些工具可以提升您的編碼技能並滿足現代應用程序需求。

常見問題解答

什麼是 .NET Core 中的 Hangfire?

Hangfire 是一個框架,簡化了在 ASP.NET Core 或 .NET Core 6 應用程式中實現背景處理的過程。它提供了一個可靠且靈活的方案,用於管理和執行背景工作。

如何在 .NET Core 應用程式中安裝 Hangfire?

Hangfire 可以作為 NuGet 套件安裝。您可以使用 .NET CLI 添加它,指令為:dotnet add package Hangfire --version 1.8.6

Hangfire 支援哪些類型的背景工作?

Hangfire 支援各種背景工作類型,包括即時工作、延遲工作、定期工作和續作工作。

如何在 .NET Core 應用程式中配置 Hangfire?

Hangfire 規範在 Startup.cs 文件中,在此您設置工作儲存並初始化 Hangfire 伺服器。通常涉及添加 Hangfire 服務並設置 SQL Server 或記憶體儲存。

什麼是 Hangfire 控制台?

Hangfire 控制板是一個用於監控和管理背景工作的平台。它提供有關實時處理、已成功完成的工作和計劃中工作的資訊,可通過網頁界面訪問。

如何使用 Hangfire 創建背景工作?

可以通過在 Hangfire 中定義您想運行的方法並使用 Hangfire API 排隊他們來創建背景工作。工作可以立即安排、延遲後或定期運行。

如何在 .NET Core 中執行 PDF 生成任務於背景?

您可以通過支持 HTML 到 PDF 轉換的 PDF 庫在背景中執行 PDF 生成任務。這可以集成到像 Hangfire 這樣的背景工作處理框架中,以自動化從 HTML 內容生成 PDF。

在 .NET 中 PDF 生成庫有什麼功能?

PDF 生成庫可以將 HTML 字串、HTML 文件和 URL 轉換為 PDF。它保留布局和樣式,對於生成報告、發票和從網頁內容建立的文檔非常有用。

如何在 .NET 專案中安裝 PDF 生成庫?

可以通過 Visual Studio 中的 NuGet 套件管理器或通過套件管理器控制台以特定命令來安裝 PDF 生成庫。也可以通過從庫網站下載 DLL 直接安裝。

使用無浮水印的 PDF 生成庫需要什麼?

要使用無浮水印的 PDF 生成庫,通常需要授權密鑰。可以通過在庫網站註冊獲得免費試用授權。

如何將 PDF 生成工具與 .NET Core 中的 Hangfire 集成?

可以通過建立使用 PDF 生成庫的背景工作將 PDF 生成工具與 .NET Core 中的 Hangfire 集成,這允許在應用程式中自動化文檔創建和管理。

Jacob Mellor, Team Iron 首席技術官
首席技術官

Jacob Mellor是Iron Software的首席技術官,也是開創C# PDF技術的前瞻性工程師。作為Iron Software核心代碼庫的原始開發者,他自公司成立以來就塑造了公司的產品架構,並與CEO Cameron Rimington將公司轉型為服務NASA、Tesla以及全球政府機構的50多人公司。

Jacob擁有曼徹斯特大學土木工程一級榮譽學士學位(1998年–2001年)。他於1999年在倫敦開立首家軟體公司,並於2005年建立了他的第一個.NET組件,專注於解決Microsoft生態系統中的複雜問題。

他的旗艦作品IronPDF和Iron Suite .NET程式庫全球已獲得超過3000萬次NuGet安裝,他的基礎代碼不斷在全球各地驅動開發者工具。擁有25年以上的商業經驗和41年的編碼專業知識,Jacob仍然專注於推動企業級C#、Java和Python PDF技術的創新,同時指導下一代技術領導者。

Iron Support Team

We're online 24 hours, 5 days a week.
Chat
Email
Call Me