Test in einer Live-Umgebung
Test in der Produktion ohne Wasserzeichen.
Funktioniert überall, wo Sie es brauchen.
Die moderne Anwendungsentwicklung erfordert häufig die Verarbeitung von Hintergrundaufgaben, um große Aufgaben zu bewältigen. In diesem Szenario benötigen wir Hintergrund-Job-Handler, um mehrere Aufgaben auszuführen. Es gibt viele Job-Handler, und ein solcher Hintergrund-Job-Handler für C# .NET Core-Anwendungen ist Hangfire. In diesem Blog werden wir etwas über den Hintergrundjob von Hangfire erfahren und wie man ihn mit anderen Paketen verwendet, wie zum BeispielIronPDFim Hintergrund PDF-Dokumente zu erstellen.
Hangfirevereinfacht die Implementierung der Hintergrundverarbeitung in ASP.NET Core oder .NET Core 6 Web API-Anwendungen, indem es ein zuverlässiges und flexibles Framework zur Verwaltung und Ausführung von Hintergrundjobs bereitstellt. Hangfire ist verfügbar als einNuGetPaket und kann wie unten beschrieben mit .NET CLI installiert werden.
dotnet add package Hangfire --version 1.8.6
Um mehr über Hangfire zu lernen, erstellen wir eine einfache .NET Core API-Anwendung und installieren Hangfire mithilfe der CLI.
dotnet new webapi -n HangfireDemo
cd HangfireDemo
dotnet build
dotnet add package Hangfire --version 1.8.6
dotnet build
Hier erstellen wir eine einfache Wetter-REST-API mit dem .NET CLI. Die erste Zeile erstellt ein Core-Web-API-Projekt mit dem Namen HangfireDemo.(kann auch ASP.NET Core erstellen)um API-Endpunkte auszuführen. Die zweite Zeile dient dazu, zu unserem neu erstellten Ordner "HangfireDemo" zu navigieren und dann das Projekt zu erstellen. Als Nächstes haben wir das Hangfire-NuGet-Paket zu unserem Projekt hinzugefügt und es erneut gebaut. Danach können Sie Ihr Projekt in einem beliebigen Editor Ihrer Wahl öffnen, Visual Studio 2022 oder JetBrains Rider. Wenn Sie nun das Projekt ausführen, können Sie das Swagger wie unten sehen.
Hier sehen wir die Wetter-GET-APIs, die Datum, Zusammenfassung und Temperatur zurückgeben.
Fügen wir nun einen Hangfire-Hintergrund-Jobprozessor hinzu. Projekt in Visual Studio öffnen.
Konfigurieren Sie Hangfire in Ihrer Anwendung, typischerweise in der Datei Startup.cs. Dies umfasst die Einrichtung eines Job-Speichers und die Initialisierung des Hangfire-Servers.
// Startup.cs
using Hangfire;
public class Startup
{
public void ConfigureServices(IServiceCollection services)
{
// Add Hangfire services
services.AddHangfire(config => config.UseSqlServerStorage("your_connection_string"));
}
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
// Configure Hangfire
app.UseHangfireServer();
app.UseHangfireDashboard();
// Your other configuration settings
}
}
// Startup.cs
using Hangfire;
public class Startup
{
public void ConfigureServices(IServiceCollection services)
{
// Add Hangfire services
services.AddHangfire(config => config.UseSqlServerStorage("your_connection_string"));
}
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
// Configure Hangfire
app.UseHangfireServer();
app.UseHangfireDashboard();
// Your other configuration settings
}
}
' Startup.cs
Imports Hangfire
Public Class Startup
Public Sub ConfigureServices(ByVal services As IServiceCollection)
' Add Hangfire services
services.AddHangfire(Function(config) config.UseSqlServerStorage("your_connection_string"))
End Sub
Public Sub Configure(ByVal app As IApplicationBuilder, ByVal env As IHostingEnvironment)
' Configure Hangfire
app.UseHangfireServer()
app.UseHangfireDashboard()
' Your other configuration settings
End Sub
End Class
Die Methode ConfigureServices wird verwendet, um Speicher hinzuzufügen, damit die neu erstellten Jobs von Hangfire gespeichert werden können. Hier wird eine SQL Server-Datenbank verwendet. Der SQL Server-Verbindungszeichenfolge sollte durch "your_connection_string" ersetzt werden. Man kann auch den Speicher im Arbeitsspeicher mit Hangfire.InMemory verwenden.
dotnet add package Hangfire.InMemory --version 0.6.0
Und ersetzen mit
services.AddHangfire(configuration => { configuration.UseInMemoryStorage(); });
services.AddHangfire(configuration => { configuration.UseInMemoryStorage(); });
services.AddHangfire(Sub(configuration)
configuration.UseInMemoryStorage()
End Sub)
Definieren Sie die Methoden, die Sie als Hintergrundaufgabe ausführen möchten. Diese Methoden sollten statische oder Instanzmethoden einer Klasse mit einem parameterlosen Konstruktor sein. Die Jobs können als wiederkehrende Jobs ausgeführt werden oder es können viele Jobs ausgeführt werden.
public class MyBackgroundJob
{
public void ProcessJob()
{
// Your background job logic, recurring job or multiple jobs
Console.WriteLine("Background job is running...");
}
}
public class MyBackgroundJob
{
public void ProcessJob()
{
// Your background job logic, recurring job or multiple jobs
Console.WriteLine("Background job is running...");
}
}
Public Class MyBackgroundJob
Public Sub ProcessJob()
' Your background job logic, recurring job or multiple jobs
Console.WriteLine("Background job is running...")
End Sub
End Class
Enqueue-Hintergrundaufgaben mithilfe der Hangfire-API. Sie können Hintergrundjobs so planen, dass sie zu einer bestimmten Zeit, nach einer Verzögerung oder regelmäßig ausgeführt werden.
// Enqueue a job to run immediately
BackgroundJob.Enqueue<MyBackgroundJob>(x => x.ProcessJob());
// Schedule a job to run after 5 min delay, delayed job
BackgroundJob.Schedule<MyBackgroundJob>(x => x.ProcessJob(), TimeSpan.FromMinutes(5));
// Schedule a recurring job / recurring jobs using job Id
RecurringJob.AddOrUpdate<MyBackgroundJob>("job Id", x => x.ProcessJob(), Cron.Daily);
// Enqueue a job to run immediately
BackgroundJob.Enqueue<MyBackgroundJob>(x => x.ProcessJob());
// Schedule a job to run after 5 min delay, delayed job
BackgroundJob.Schedule<MyBackgroundJob>(x => x.ProcessJob(), TimeSpan.FromMinutes(5));
// Schedule a recurring job / recurring jobs using job Id
RecurringJob.AddOrUpdate<MyBackgroundJob>("job Id", x => x.ProcessJob(), Cron.Daily);
' Enqueue a job to run immediately
BackgroundJob.Enqueue(Of MyBackgroundJob)(Function(x) x.ProcessJob())
' Schedule a job to run after 5 min delay, delayed job
BackgroundJob.Schedule(Of MyBackgroundJob)(Function(x) x.ProcessJob(), TimeSpan.FromMinutes(5))
' Schedule a recurring job / recurring jobs using job Id
RecurringJob.AddOrUpdate(Of MyBackgroundJob)("job Id", Function(x) x.ProcessJob(), Cron.Daily)
Das Hangfire-Dashboard und der Server können in der Configure-Methode hinzugefügt werden.
// Run Hangfire server
app.UseHangfireServer();
app.UseHangfireDashboard();
// Run Hangfire server
app.UseHangfireServer();
app.UseHangfireDashboard();
' Run Hangfire server
app.UseHangfireServer()
app.UseHangfireDashboard()
Der Server kann auch in ConfigureServices hinzugefügt werden.
services.AddHangfireServer();
services.AddHangfireServer();
services.AddHangfireServer()
//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!")); //jobId for Fire and forget job
//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!")); //jobId for Fire and forget job
'Fire and forget job / Fire and forget jobs are executed only once and almost immediately after creation.
Dim jobId = BackgroundJob.Enqueue(Sub() Console.WriteLine("Fire-and-forget!")) 'jobId for Fire and forget job
//Recurring jobs fire many times on the specified CRON schedule.
RecurringJob.AddOrUpdate( "myrecurringjob",() => Console.WriteLine("Recurring!"),Cron.Daily);
//Recurring jobs fire many times on the specified CRON schedule.
RecurringJob.AddOrUpdate( "myrecurringjob",() => Console.WriteLine("Recurring!"),Cron.Daily);
'Recurring jobs fire many times on the specified CRON schedule.
RecurringJob.AddOrUpdate("myrecurringjob",Sub() Console.WriteLine("Recurring!"),Cron.Daily)
//Delayed jobs are executed only once too, but not immediately, after a certain specific interval.
var jobId = BackgroundJob.Schedule(() => Console.WriteLine("Delayed!"),
TimeSpan.FromDays(7));
//Delayed jobs are executed only once too, but not immediately, after a certain specific interval.
var jobId = BackgroundJob.Schedule(() => Console.WriteLine("Delayed!"),
TimeSpan.FromDays(7));
'Delayed jobs are executed only once too, but not immediately, after a certain specific interval.
Dim jobId = BackgroundJob.Schedule(Sub() Console.WriteLine("Delayed!"), TimeSpan.FromDays(7))
//Continuation jobs are executed when its parent job has been finished, immediate child job
BackgroundJob.ContinueJobWith(jobId,() => Console.WriteLine("Continuation!"));
//Continuation jobs are executed when its parent job has been finished, immediate child job
BackgroundJob.ContinueJobWith(jobId,() => Console.WriteLine("Continuation!"));
'Continuation jobs are executed when its parent job has been finished, immediate child job
BackgroundJob.ContinueJobWith(jobId,Sub() Console.WriteLine("Continuation!"))
//Batch is a group of background jobs that is created atomically and considered as a single entity. Two jobs can be run as below.
var batchId = BatchJob.StartNew(x =>
{
x.Enqueue(() => Console.WriteLine("Job 1"));
x.Enqueue(() => Console.WriteLine("Job 2"));
});
//Batch is a group of background jobs that is created atomically and considered as a single entity. Two jobs can be run as below.
var batchId = BatchJob.StartNew(x =>
{
x.Enqueue(() => Console.WriteLine("Job 1"));
x.Enqueue(() => Console.WriteLine("Job 2"));
});
'Batch is a group of background jobs that is created atomically and considered as a single entity. Two jobs can be run as below.
Dim batchId = BatchJob.StartNew(Sub(x)
x.Enqueue(Sub() Console.WriteLine("Job 1"))
x.Enqueue(Sub() Console.WriteLine("Job 2"))
End Sub)
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"));
});
Dim tempVar As Boolean = TypeOf continuation Is fired
Dim [when] As fired = If(tempVar, CType(continuation, fired), Nothing)
Batch tempVar all background jobs in a parent batch are finished.BatchJob.ContinueBatchWith(batchId, Sub(x)
x.Enqueue(Sub() Console.WriteLine("Last Job"))
End Sub)
Das Hangfire-Dashboard ist der Ort, an dem Sie alle Informationen über Ihre Hintergrundjobs finden können. Es ist als OWIN-Middleware geschrieben.(wenn Sie mit OWIN nicht vertraut sind, keine Sorge), damit Sie es in Ihre ASP.NET-, ASP.NET MVC-, Nancy- und ServiceStack-Anwendung einbinden können, sowie denOWIN Self-HostFunktion zur Einbettung eines Dashboards in Konsolenanwendungen oder Windows-Dienste.
Wenn Sie das Dashboard in Ihrer Ansicht aktiviert haben, befindet sich das Dashboard unter der /hangfire/ Erweiterung. In diesem Dashboard kann man Hintergrundaufgaben verwalten, Hintergrundaufgaben planen, Fire-and-Forget-Jobs anzeigen und wiederkehrende Jobs verwalten. Die Aufgaben können mithilfe der Job-ID identifiziert werden.
Die erfolgreichen Jobs können unten eingesehen werden.
Nun, wenn Ihre Anwendung läuft, wird sich Hangfire um die Verarbeitung der Hintergrundaufgaben basierend auf den konfigurierten Einstellungen kümmern.
Denken Sie daran, die Hangfire-Dokumentation für weitere fortgeschrittene Konfigurationsmöglichkeiten und Funktionen zu überprüfen: HangfireDokumentationund der vollständige Code ist zu finden aufGitHub.
IronPDFist einNuGetPaket vonIron Softwaredas beim Lesen und Erstellen von PDF-Dokumenten hilft. Es kann einfach formatierte Dokumente mit Stilinformationen in PDF konvertieren. IronPDF kann problemlos PDFs aus HTML-Inhalten erstellen. Es kann das HTML von der URL herunterladen und dann PDFs erstellen.
Der Hauptanziehungspunkt von IronPDF ist seineHTML zu PDFFunktion, die Layouts und Stile beibehält. Es kann PDFs aus Webinhalten erstellen, ideal für Berichte, Rechnungen und Dokumentationen. Diese Funktion unterstützt die Umwandlung von HTML-Dateien, URLs und HTML-Strings in PDFs.
using IronPdf;
class Program
{
static void Main(string[] args)
{
var renderer = new ChromePdfRenderer();
// 1. 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");
// 2. 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");
// 3. 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();
// 1. 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");
// 2. 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");
// 3. Convert URL to PDF
var url = "http://ironpdf.com"; // Specify the URL
var pdfFromUrl = renderer.RenderUrlAsPdf(url);
pdfFromUrl.SaveAs("URLToPDF.pdf");
}
}
Imports IronPdf
Friend Class Program
Shared Sub Main(ByVal args() As String)
Dim renderer = New ChromePdfRenderer()
' 1. Convert HTML String to PDF
Dim htmlContent = "<h1>Hello, IronPDF!</h1><p>This is a PDF from an HTML string.</p>"
Dim pdfFromHtmlString = renderer.RenderHtmlAsPdf(htmlContent)
pdfFromHtmlString.SaveAs("HTMLStringToPDF.pdf")
' 2. Convert HTML File to PDF
Dim htmlFilePath = "path_to_your_html_file.html" ' Specify the path to your HTML file
Dim pdfFromHtmlFile = renderer.RenderHtmlFileAsPdf(htmlFilePath)
pdfFromHtmlFile.SaveAs("HTMLFileToPDF.pdf")
' 3. Convert URL to PDF
Dim url = "http://ironpdf.com" ' Specify the URL
Dim pdfFromUrl = renderer.RenderUrlAsPdf(url)
pdfFromUrl.SaveAs("URLToPDF.pdf")
End Sub
End Class
Install-Package IronPdf
Install-Package IronPdf
Fangen Sie noch heute an, IronPDF in Ihrem Projekt mit einer kostenlosen Testversion zu verwenden.
Schau dir an IronPDF an Nuget Für schnelle Installation und Bereitstellung. Mit über 8 Millionen Downloads verwandelt es PDF mit C#.
Install-Package IronPdf
Erwägen Sie die Installation der IronPDF DLL direkt. Laden Sie es herunter und installieren Sie es manuell für Ihr Projekt oder die GAC-Form: IronPdf.zip
Manuelle Installation in Ihr Projekt
DLL herunterladenUm IronPDF in Ihr Hangfire .NET-Projekt mit dem NuGet-Paketmanager zu integrieren, folgen Sie diesen Schritten:
Öffnen Sie Visual Studio und klicken Sie im Lösungs-Explorer mit der rechten Maustaste auf Ihr Projekt.
Wählen Sie „NuGet-Pakete verwalten...“ aus dem Kontextmenü.
Gehe zum "Durchsuchen"-Tab und suche nach IronPDF.
Wählen Sie die IronPDF-Bibliothek aus den Suchergebnissen aus und klicken Sie auf die Installationsschaltfläche.
Akzeptieren Sie jede Lizenzvereinbarungsaufforderung.
Wenn Sie IronPDF in Ihr Projekt über die Paket-Manager-Konsole einbinden möchten, führen Sie den folgenden Befehl in der Paket-Manager-Konsole aus:
Install-Package IronPdf
Es lädt IronPDF herunter und installiert es in Ihr Projekt.
Für einen detaillierten Überblick über IronPDF, einschließlich seiner Funktionen, Kompatibilität und zusätzlichen Download-Optionen, besuchen Sie die IronPDF-Seite auf der NuGet-Website unter https://www.nuget.org/packages/IronPdf.
Alternativ können Sie IronPDF direkt in Ihr Projekt integrieren, indem Sie dessen DLL-Datei verwenden. Laden Sie die ZIP-Datei herunter, die die DLL enthält, von diesemLink. Entpacken Sie es und fügen Sie die DLL in Ihr Projekt ein.
Nun lass uns unsere Anwendung anpassen, um einen Hintergrundverarbeitungsjob hinzuzufügen, der eine Website aus einer HTTP-Anfrage-Pipeline als PDF-Datei herunterlädt.
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);
}
}
Namespace HangfireDemo.Core
Public Class PdfGenerationJob
Public Sub Start(ByVal website As String)
' Create a PDF from any existing web page
Dim renderer As New ChromePdfRenderer()
Dim pdf As PdfDocument = renderer.RenderUrlAsPdf(website)
Dim filePath = AppContext.BaseDirectory & "result.pdf"
pdf.SaveAs(filePath)
End Sub
End Class
End Namespace
IronPDF verfügt über eine eingebaute Methode, um eine Website von einer URL herunterzuladen und als PDF-Dokument zu speichern. Wir werden diese Methode in unserem Job verwenden, um es herunterzuladen und an einem temporären Ort zu speichern. Dieser Hintergrundauftrag kann so modifiziert werden, dass er mehrere Website-URLs annimmt und sie als PDFs speichert.
Fügen wir nun einen Controller hinzu, um die PDF-Generierungs- und Download-APIs bereitzustellen.
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" };
}
}
Imports Hangfire
Imports HangfireDemo.Core
Imports Microsoft.AspNetCore.Mvc
Namespace HangfireDemo.Controllers
<ApiController>
<Route("[controller]")>
Public Class PdfGeneratorController
Inherits ControllerBase
<HttpGet("request", Name := "Start PDF Generation")>
Public Sub Start(<FromQuery> ByVal websiteUrl As String)
BackgroundJob.Enqueue(Of PdfGenerationJob)(Function(x) x.Start(websiteUrl))
End Sub
<HttpGet("result", Name := "Download PDF Generation")>
Public Function WebResult() As IActionResult
Dim filePath = AppContext.BaseDirectory & "result.pdf"
Dim stream = New FileStream(filePath, FileMode.Open)
Return New FileStreamResult(stream, "application/octet-stream") With {.FileDownloadName = "website.pdf"}
End Function
End Class
End Namespace
Hier haben wir zwei APIs erstellt, eine, um den Hintergrundjob zu starten, der die Website-URL aufnimmt und den Download initiiert. Eine weitere API ermöglicht das Herunterladen des PDF-Ergebnisses. Die APIs sehen wie unten gezeigt aus.
Das Ergebnis sieht wie folgt aus.
Damit der obige Code ohne Wasserzeichen funktioniert, ist ein Lizenzschlüssel erforderlich. Eine Testlizenz ist für Entwickler nach der Registrierung erhältlich.hierund ja, keine Kreditkarte ist für eine Testlizenz erforderlich. Man kann die E-Mail-ID angeben und sich für eine kostenlose Testversion registrieren.
Hangfire und IronPDF zusammen sind eine großartige Kombination, um PDFs im Hintergrund zu erstellen und herunterzuladen. Wir können Hangfire in verschiedenen Programmierparadigmen verwenden, um lang andauernde Aufgaben zu verarbeiten. IronPDF bietet eine flexible und benutzerfreundliche Lösung zur Erstellung von PDFs. Um mehr über IronPDF zu erfahren, können Sie die Dokumente findenhier.
Außerdem können Sie andere Tools vonIron Softwaredie Ihnen helfen werden, Ihre Programmierfähigkeiten zu verbessern und moderne Anwendungsanforderungen zu erfüllen.
9 .NET API-Produkte für Ihre Bürodokumente