Problembehandlung |
Scroll |
Wie funktioniert "Funktion aufrufen"?
Ein grundlegendes Verständnis der Funktionsweise dieser Aktivität kann die Problembehandlung unterstützen. Das folgende Diagramm zeigt, wie die verschiedenen Komponenten miteinander interagieren.
Wenn die Workflow Engine die Aktivität "Funktion aufrufen" ausführt, wird eine HTTPS POST-Anfrage an die betreffende Funktion gesendet. Wenn der Aufruf erfolgreich ist, wird die Funktion ausgeführt und sie ruft wahrscheinlich über die Web-API den Therefore™-Server auf, um Dokumente, Indexdaten oder andere zusätzliche Informationen abzurufen, die sie für ihre Zwecke benötigt.
Bei der aufgerufenen Funktion kann es sich um eine Azure-Funktion, einen Webdienst oder eine beliebige ausführbare Datei handeln, die auf HTTPS POST-Anfragen reagieren kann. Die aufgerufene Funktion muss jedoch ein JSON-Objekt zurückliefern, das die Zeichenfolge "TheError" sowie entweder den Booleschen Wert "TheRoutingDone" oder die Ganzzahl "TheRetryAfterMin" enthält. Wenn die Funktion von Therefore™ entwickelt wurde, kann sie im Therefore™ Online-Azure-Abonnement gehostet werden.
Aus Sicherheitsgründen müssen von Kunden entwickelte Funktionen in ihrem eigenen Azure-Abonnement oder in ihrer eigenen Infrastruktur ausgeführt werden.
Wie im Diagramm gezeigt, sind alle Verbindungen zwischen Therefore™ und der aufgerufenen Funktion HTTPS POST-Anfragen und (Web-) API-Aufrufe. Kundencode wird weder vom Serverdienst noch in der Therefore™ Online-Umgebung ausgeführt. Beim Ausführen von Web-API-Aufrufen gelten wie normal alle Zugriffsrechtprüfungen. Der mit der HTTPS-Anfrage bereitgestellte Zugriffstoken gilt nur für die aktuelle Workflow-Instanz. Aufgrund dieser Architektur ist das Anpassen von Workflows für den Gebrauch in Therefore™ Online sicher.
Wie werden Fehlermeldungen protokolliert?
Alle Fehlermeldungen, die auftreten, sollten im Workflow-Verlauf festgehalten werden.
Wie im Architekturdiagramm gezeigt, sendet Therefore™ lediglich eine HTTPS-Anfrage, während das wichtigste Element (der Kundencode) innerhalb der aufgerufenen Funktion ausgeführt wird.
Wenn die Funktion fehlschlägt, sollten alle aufgetretenen Fehler an Therefore™ gemeldet werden, um sie im Workflow-Verlauf zu protokollieren. Wenn die Funktion einen Fehler zurückgeliefert hat, beginnt der betreffende Eintrag im Workflow-Verlauf mit “Die aufgerufene Funktion hat einen Fehler zurückgeliefert”. Wenn die Funktion aufgrund einer unbehandelten Ausnahme abstürzt oder einfach keine Informationen zurückliefert, kann Therefore™ nichts protokollieren. Wenn eine Funktion ein JSON-Objekt mit einer leeren Zeichenfolge "TheError" und "TheRoutingDone" auf "false" eingerichtet zurückliefert, wird die Ausführung als bereits erfolgreich angesehen, da der HTTPS-Aufruf funktioniert hat und kein Fehler gemeldet wurde.
Nachfolgend finden Sie eine Reihe von Fehlern, die auftreten können, wenn eine Funktion aufgerufen wird:
|
---|
Wie funktioniert die Überwachung im Azure-Portal?
Zum Überwachen von Azure-Funktionen sollten die "Application Insights" von Microsoft konfiguriert sein. Sie können eine Liste der letzten Funktionsaufrufe anzeigen, wenn Sie die gewünschte Funktion im Azure-Portal auswählen und dann auf "Monitor" klicken.
Funktionsaufrufe werden als erfolgreich angezeigt, wenn keine unbehandelte Ausnahme aufgetreten ist, unabhängig vom Ergebniscode oder von abgefangenen Ausnahmen. Therefore™ behandelt dies ähnlich – wenn eine Ausnahme abgefangen wurde, sollte sie mit dem Statuscode 200 und den Informationen zur Ausnahme in der zurückgelieferten Zeichenfolge "TheError" gemeldet werden.
Wenn dagegen eine unbehandelte Ausnahme aufgetreten ist, kann nichts aus der Funktion an Therefore™ zurückgeliefert werden und der Webdienst sendet lediglich den Statuscode 500. In einem solchen Fall können keine weiteren Informationen als der Statuscode 500 in Therefore™ angezeigt werden und Sie müssen die Azure-Überwachung auf Einzelheiten überprüfen.
Über die "Operation ID" können Sie die Ausnahmetabelle auf Einzelheiten und die Stack Traces abfragen. Kopieren Sie die "Operation ID" und klicken Sie auf "Run in Application Insights", um sie in einer neuen Registerkarte zu öffnen.
Fügen Sie die "Operation ID" in das Abfragefenster ein und geben Sie eine Abfrage wie die folgende ein:
exceptions | where operation_Id == "OperationID"
| limit 50
Nachdem Sie auf "Run" geklickt haben, sollten dann Ausnahmeinformationen zu der betreffenden "Operation ID" aufgelistet werden.
Sie sollten mindestens eine Zeile mit Ausnahmeinformationen sehen.
Exportieren Sie alle Zeilen und senden Sie sie an den für diese Azure-Funktion verantwortlichen Entwickler.
Prüfen Sie auch die Trace-Tabelle auf zusätzliche Workflow-Informationen. Wenn ein Beispielprojekt verwendet wurde, sollte jeder Funktionsaufruf mit "instance-number", "token-number" sowie "case-number" oder "document-number" protokolliert sein.
Kopieren Sie die obige Abfrage und ersetzen Sie "exceptions" durch "traces":
traces | where operation_Id == "OperationID"
| limit 50
Machen Sie diese Informationen ebenfalls verfügbar, wenn Sie den Entwickler kontaktieren.
Wenn die Funktion Konvertierungsaktivitäten ausführt, sollte das entsprechende Dokument ebenfalls bereitgestellt werden.
Häufig gestellte Fragen zur Entwicklung
Wo und wie kann ich eine Azure-Funktion entwickeln?
Die Entwicklung einer Azure-Funktion kann vollständig in Visual Studio geschehen, ohne dass dazu ein Azure-Abonnement erforderlich ist. Nachdem Sie eine Azure-Funktion über den Projektassistenten erstellt haben, können Sie sie durch Drücken von F5 starten. Der Debugger mit Unterbrechungspunkten funktioniert genau wie bei anderen Anwendungen auch.
Muss ich ein Azure-Abonnement haben?
Nicht für die Entwicklung und das Testen. Azure-Funktionen können direkt in Visual Studio geschrieben und ausgeführt werden. Wenn das Entwicklungssystem öffentlich über HTTP zugänglich ist, könnte es sogar mit Therefore™ Online verwendet werden. Um die Azure-Funktion in einer Produktionsumgebung auszuführen, wird ein Azure-Abonnement benötigt. Es ist jedoch auch möglich, eine Funktion für einen Webdienst zu erstellen, der nicht in Microsoft Azure gehostet wird. In diesem Fall ist kein Abonnement erforderlich.
Warum liefert meine Funktion einen verbindlichen Parameter nicht zurück?
Alle Funktionen, die von der Aktivität "Funktion aufrufen" aufgerufen werden, müssen ein JSON-Objekt zurückliefern, das die Zeichenfolge "TheError" sowie entweder den Booleschen Wert "TheRoutingDone" oder die Ganzzahl "TheRetryAfterMin" enthält.
Wenn kein Fehler aufgetreten ist, wird "TheError" leer sein, aber die Zeichenfolge muss im JSON-Objekt vorliegen. Im Fall eines Fehlers ist es jedoch wichtig, die Ausnahme abzufangen und sie über "TheError" zur Protokollierung an Therefore™ weiterzuleiten.
Wie kann ich meine (Azure-) Funktion ohne Therefore™ testen?
Besonders im Frühstadium der Entwicklung von (Azure-) Funktionen kann es einfacher sein, die Funktion zu Testzwecken direkt aufzurufen. Mit cURL kann dies über den folgenden Befehl geschehen:
curl –d “” –i –X POST http://localhost:Port/api/Route
Wenn die Funktion bereits in Azure implementiert ist, verwenden Sie anstelle dessen den folgenden Befehl:
curl –d “” –i –X POST “https://AppName.azurwebsites.net/api/Route?code=FunctionKey”
Die Route kann in Code definiert werden. Wenn sie nicht definiert ist, wird anstelle dessen der Funktionsname verwendet.
Aufrufen der Web-API-Ergebnisse in "Zugriff verweigert" oder "Sie dürfen nicht…"
Aus Sicherheitsgründen hat der bereitgestellte JWT-Token nur sehr beschränkte Zugriffsrechte und es wird daher wahrscheinlich zu Rechteproblemen kommen. Wenn zusätzliche Zugriffsrechte erforderlich sind, müssen Sie einen internen Benutzer erstellen, der alle erforderlichen Rechte hat. Die Anmeldeinformationen können dann in "WebAPIUser" und "WebAPIPassword" übergeben werden, indem Sie diese im Azure-Portal als Anwendungseinstellung oder für die lokale Entwicklung zur Datei "local.settings.json" hinzufügen.
Kann ich die Therefore™-API für meine Funktion verwenden?
Dies hängt von der Plattform ab, die Sie benutzen. Bei Azure-Funktionen muss die Therefore™ Web API verwendet werden, da die normale API zu viele Abhängigkeiten hat.