Ich habe einige C # Azure-Funktionen, die nach einem Zeitplan mit Timer-Triggern ausgeführt werden . Ich habe sie so eingerichtet, wobei %TimerSchedule%
auf einen Cron-Ausdruck in den App-Einstellungen verwiesen wird:
public static void Run([TimerTrigger("%TimerSchedule%")]TimerInfo myTimer, TraceWriter log)
Während der Entwicklung möchte ich die Funktionen häufig lokal mit den Azure-Funktionstools für Visual Studio + Azure-Funktionen-Kerntools ausführen. Aber wenn ich F5 drücke, um die Funktion lokal zu debuggen, wird sie (normalerweise) nicht sofort ausgeführt. Stattdessen wird gemäß dem Timer-Zeitplan auf das nächste Auftreten gewartet. Wenn mein Cron-Ausdruck beispielsweise sagt, dass er täglich um 20 Uhr ausgeführt werden soll, muss ich bis 20 Uhr warten, bis die Funktion tatsächlich auf meinem Computer ausgeführt wird.
Meine Frage lautet also: Was ist der einfachste und beste Weg, um eine Funktion einmal lokal auszuführen?
Dinge, die ich versucht oder in Betracht gezogen habe:
- Verwenden Sie einen häufigeren Timer-Zeitplan nur für die lokale Entwicklung
- Dies ist in Ordnung, aber nicht perfekt. Sie müssen immer noch ein wenig warten, es sei denn, es ist sehr häufig. Wenn es sehr häufig ist, wird die Funktion möglicherweise mehrmals ausgeführt. Das mache ich jetzt.
- Schreiben Sie eine Konsolen-App oder einen Komponententest, der die
Run()
Methode der Funktion direkt aufruft- Dies ist nicht zu 100% einfach , weil Sie zu bieten haben
TimerInfo
undTraceWriter
Argumente zuRun()
- und ich habe überraschend wenig Dokumentation dafür gefunden.
- Dies ist nicht zu 100% einfach , weil Sie zu bieten haben
Die Strategien von Microsoft zum Testen Ihres Codes auf der Seite " Azure-Funktionen " sind in diesem Thema nicht sehr hilfreich. Sie erwähnen nur Timer-Trigger, um andere Triggertypen zu testen .
In einer perfekten Welt würde ich F5 drücken und die Funktion würde sofort einmal ausgeführt - genau wie bei der Entwicklung einer "normalen" .NET-App.
quelle
Sie könnten vielleicht die hier
RunOnStartup
dokumentierte Flagge verwenden . Es entspricht nicht ganz Ihrem Auftrag, es nur einmal auszuführen, sollte es jedoch zumindest lokal ausführen, sobald die App gestartet wurde.Beispiel mit Attributbindung:
[TimerTrigger("%TimerSchedule%", RunOnStartup = true)]TimerInfo myTimer
quelle
If true, the function is invoked when the runtime starts. For example, the runtime starts when the function app wakes up after going idle due to inactivity. when the function app restarts due to function changes, and when the function app scales out. **So runOnStartup should rarely if ever be set to true, especially in production**
Von https://docs.microsoft.com/en-us/azure/azure-functions/functions-run-local?tabs=windows%2Ccsharp%2Cbash#non-http-triggered-functions
http://localhost:{port}/admin/functions/{function_name}
{ "input": "<trigger_input>" }
quelle
Wenn Sie VS-Code verwenden, verwenden Sie die Erweiterung Azure-Funktionen :
Local Project
finden Sie die Funktion , die Sie ausführen möchten, die rechte Maustaste und wählen Sie „Jetzt ausführen Function“.Lesen Sie diese MS- Kurzanleitung .
quelle
Ich hatte die gleiche Frage. Ich habe es mit einem Unittest behoben. In der Tat müssen Sie den TraceWriter und die TimerInfo auslöschen.
Hier ein Code, wie ich das gemacht habe.
TimerInfo:
public class ScheduleStub : TimerInfo { public ScheduleStub(TimerSchedule schedule, ScheduleStatus status, bool isPastDue = false) : base(schedule, status, isPastDue) { } }
Und der TraceWriter:
public class TraceWriterStub : TraceWriter { protected TraceLevel _level; protected List<TraceEvent> _traces; public TraceWriterStub(TraceLevel level) : base(level) { _level = level; _traces = new List<TraceEvent>(); } public override void Trace(TraceEvent traceEvent) { _traces.Add(traceEvent); } public List<TraceEvent> Traces => _traces; }
quelle
Die Verwendung eines Postboten sollte den Trick tun. Führen Sie die folgenden Schritte aus, um den Timer-Trigger lokal auszuführen oder zu debuggen.
1. Führen Sie Ihr Projekt aus.
Öffnen Sie Postman und hinter dieser URL
http://localhost:{port}/admin/functions/{function_name}
Stellen Sie sicher, dass Sie eine POST-Methode mit dem Json-Body von {"input": ""} verwenden.
Drücken Sie SENDEN.
Sie sollten eine Antwort von 202 erhalten.
quelle
Fügen Sie einfach eine weitere Funktion mit HTTP-Triggertyp innerhalb derselben Klasse hinzu, fügen Sie Ihren Code hinzu oder rufen Sie Ihre Run-Methode über diese Funktion auf und rufen Sie sie über Ihren Browser auf.
Stellen Sie sicher, dass Sie diese Funktion kommentieren / entfernen, wenn Sie für prod bereitgestellt werden. Andernfalls können Sie die Funktion über HTTP-Aufrufe in prod auslösen.
quelle