2016-05-31 4 views
6

Ich arbeite an einer ASP.NET Core RC2-Anwendung. Diese Anwendung muss bestimmte Tasks regelmäßig aufrufen, z. B. E-Mails senden oder bestimmte Geschäftslogik aufrufen.In regelmäßigen Abständen in einer ASP.NET Core RC2-Anwendung Hintergrundaufgaben ausführen

Mir ist bekannt, dass es Bibliotheken von Drittanbietern wie Hangfire oder Quartz.NET gibt, die diese Planungsfunktionalität sofort zur Verfügung stellen. Ich denke jedoch, dass keiner von diesen derzeit ASP.NET Core RC2 unterstützt. Gibt es andere Optionen, die mit ASP.NET Core RC2 kompatibel sind?

Wenn nicht, denke ich, eine mögliche Option ist die Verwendung einer dieser Bibliotheken von Drittanbietern aus einem separaten Windows-Dienst, der dann eine unterstützte Version von .NET zielen könnte. Dieser Dienst könnte dann regelmäßig über seine Web-API Anforderungen an die ASP.NET-Anwendung senden, um die Aufgaben aufzurufen.

Ich möchte jedoch keinen separaten Dienst haben, da dies die Anzahl der beweglichen Teile erhöht und die Bereitstellung unserer Anwendung erschwert.

+1

Wohin führen Sie die Anwendung? Azurblau? Wenn Sie den Azure App-Service verwenden, können Sie mithilfe der Worker-Rollen die Hintergrundanwendungen für die Antwort – Tseng

+0

@Tseng bereitstellen. Ja, es wird in Azure bereitgestellt. Legen Sie Arbeitsrollen als Alternative zur Verwendung von Hangfire/Quartz.NET vor oder schlagen Sie vor, Hangfire oder Quartz.NET in einer Arbeitsrolle zu verwenden? Ist ein WebJob eine praktikable Alternative zu einer Arbeiterrolle? – aw1975

Antwort

1

Wir verwenden eine einfache "Task Runner" -Anwendung, die Befehlszeilenparameter verwendet, um zu bestimmen, welcher Web-/Windows-Dienst aufgerufen werden soll. Verwenden Sie dann den Windows Taskplaner, um die Anwendung "Task Runner" aufzurufen. Also ist es egal, was der Service ist oder welche Technologie es geschrieben wurde in.

3
  • Wenn Sie das vollständige .NET-CLR-Targeting sind dann jede Bibliothek, die vorher gearbeitet jetzt arbeiten. Das hat sich in RC2 nicht geändert. Azure WebJobs ist eine andere Lösung, zusätzlich zu denen, die Sie bereits erwähnt haben.

  • Für CoreCLR ist mir kein Framework bekannt, das bereits kompatibel ist. Möglicherweise müssen Sie Ihre eigene Lösung erstellen oder Ihre Anwendung in zwei Teile aufteilen, indem Sie entweder den gesamten geplanten Code vollständig in .NET einbinden oder eine kleine App in .NET erstellen, die eine CoreCLR-Anwendung aufruft.

1

Sie können immer Quartz v3 bauen gehen. Es läuft bereits auf CoreCLR und Tests sind ziemlich vorbei. Sie müssen selbst aus Quellen erstellen, wenn Sie Visual Studio verwenden. See the v3 branch.

Der größte Nachteil im Moment ist die inkompatible Serialisierung, da v2 nur Binärdaten in die Datenbank serialisieren kann (Jobdatenmaps usw.) und v3 nur JSON als Serialisierungsformat unterstützt. Die Geschichte könnte sich ändern, als sie schließlich BinaryFormatter zurückbringen wollen.

Also würde ich sagen, wenn Sie glücklich sind, nur RAMJobStore ohne Datenbankpersistenz zu verwenden, sollten Sie golden sein. Es wird wahrscheinlich besser funktionieren als eine handgefertigte Lösung.

+0

Danke - ich werde es sicherlich versuchen. Wir haben Quartz in meinem vorherigen Job verwendet und es hat wirklich gut für uns funktioniert. – aw1975

5

Ein manueller Ansatz:, vorzugsweise async

  • hinzufügen while Schleife zum Dienst mit Pause (auch vorzugsweise async)
  • Rufen Sie den lange Lauf

    • erstellen Service den lang laufenden Code enthalten Methode der Serviceklasse in einem neuen Thread mit oder im Thread-Pool (oder in einem Legacy Thread).
    • Erstellen Sie eine Instanz der Klasse in Startup.cs
    • Verwenden Sie services.AddSingleton(MyServiceInstance); in Configure(... in Start.cs
  • Verwandte Themen