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 %code% .
Sie können %code% mit Autofac registrieren, wenn Sie möchten, aber es ist wahrscheinlich am einfachsten, einen geplanten Aufgabenservice zu haben:
%Vor%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 %code% sowie den Aufruf, meinen wiederkehrenden Job hinzuzufügen, auskommentiert und erhalte den folgenden Fehler in der Zeile, die auf %code% verweist:
System.NullReferenceException: 'Objektverweis nicht auf eine Instanz eines Objekts gesetzt.'
Ich verstehe, dass Hangfire kein %code% 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?
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%Das Hauptproblem, das ich jetzt habe, ist, wenn ich UseHangfireServer, ich dann muss auch HttpContext aufgelöst werden
Hier gefunden Verwenden von IoC-Containern
%code% ist nicht verfügbar
Während der Instantiierung von a sind keine Informationen zur Anfrage verfügbar Zieltyp. Wenn Sie Ihre Abhängigkeiten in einem Anforderungsbereich registrieren ( %code% in Autofac, %code% 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