Ich habe Hangfire in der Startup-Klasse meiner .NET Core-Webanwendung wie folgt installiert und konfiguriert (mit einer großen Menge des entfernten Hangfire-Codes):
%Vor%Wie Sie sehen können, verwende ich Autofac für DI. Ich habe Dinge eingerichtet, um bei jeder Ausführung des Hangfire-Jobs einen neuen Container hinzuzufügen.
Momentan habe ich UseHangfireDashboard()
sowie den Aufruf, meinen wiederkehrenden Job hinzuzufügen, auskommentiert und erhalte den folgenden Fehler in der Zeile, die auf IPrincipal
verweist:
System.NullReferenceException: 'Objektverweis nicht auf eine Instanz eines Objekts gesetzt.'
Ich verstehe, dass Hangfire kein HttpContext
hat. Ich bin mir nicht wirklich sicher, warum es überhaupt diese Codezeile für den Hangfire-Thread auslöst. Ich werde schließlich ein Dienstkonto für meine IPrincipal Abhängigkeit auflösen müssen.
Wie kann ich mein Problem mit Hangfire und HttpContext beheben?
Das Hauptproblem, das ich jetzt habe, ist, wenn ich UseHangfireServer, ich dann muss auch HttpContext aufgelöst werden
Hier gefunden Verwenden von IoC-Containern
HttpContext
ist nicht verfügbarWährend der Instantiierung von a sind keine Informationen zur Anfrage verfügbar Zieltyp. Wenn Sie Ihre Abhängigkeiten in einem Anforderungsbereich registrieren (
InstancePerHttpRequest
in Autofac,InRequestScope
in Ninject und so on), wird während des Jobaktivierungsprozesses eine Ausnahme ausgelöst.Daher sollte das gesamte Abhängigkeitsdiagramm verfügbar sein . Entweder registrieren zusätzliche Dienste ohne Verwendung des Anforderungsbereichs oder separate Verwendung Instanz des Containers, wenn Ihr IoC-Container dies nicht unterstützt Abhängigkeitsregistrierungen für mehrere Bereiche.
Das Auflösen von Bereichsabhängigkeiten in .net core würde eine Anforderung erfordern, die beim Starten und Registrieren von Jobs nicht verfügbar ist. Stellen Sie daher sicher, dass Ihr Dienst, der für die Aktivierung während des Systemstarts benötigt wird, nicht mit Gültigkeitsbereichen für Bereiche registriert ist.
%Vor%Es bleibt nur noch übrig, die Anwendung so zu konfigurieren, dass sie diesen Service mit dem wiederkehrenden Job verwendet,
%Vor%Referenzen
Warum versucht Hangfire, die .NET Core-Startup-Klasse aufzulösen?
Hangfire speichert keine Lambda-Ausdrücke in der Datenbank, es speichert den Typ und die Methode, die aufgerufen werden. Wenn dann die geplante Aufgabe ausgeführt werden soll, löst sie den Typ aus dem Container auf und ruft die Methode auf.
In Ihrem Fall ist die Methode auf Startup
.
Sie können Startup
mit Autofac registrieren, wenn Sie möchten, aber es ist wahrscheinlich am einfachsten, einen geplanten Aufgabenservice zu haben:
Ich bin nicht sicher über den Typ für den Jobmanager, aber Sie können die Abhängigkeit vom Container mithilfe eines Bereichs lösen. Sie sollten den Gültigkeitsbereich in einer using-Anweisung auflösen, um Speicherlecks zu vermeiden. Weitere Informationen finden Sie in den Autofac-Dokumenten
%Vor%Tags und Links .net c# autofac hangfire hangfire-autofac