API- und Nachrichten-Referenz

HTTP-Endpunkte mit Request und Response, Trigger-Bindungen, Schema der Service-Bus-Nachrichten und Fehlerverhalten.

Authentifizierung

Alle HTTP-Functions verwenden AuthorizationLevel.Function. Der Funktionsschlüssel wird als Query-Parameter code oder Header x-functions-key übergeben. Es gibt keine Easy-Auth- oder Entra-Konfiguration im Deployment. Timer-, Service-Bus- und Durable-Trigger haben keinen HTTP-Endpunkt.

Routen ohne Route-Attribut folgen der Konvention /api/<FunctionName>.

HTTP-Endpunkte

GET /api/GetInfo

Liefert die Assembly-Version, keine Gesundheitsprüfung.

{ "Version": "2.3.2026.0926" }

POST /api/ExecuteJob

Stößt einen Job aus der Tabelle jobs manuell an (Erkennungsphase).

{ "JobName": "<RowKey des Jobs>" }

Ablauf: JobName prüfen → EnsureInitializedAsync → ProcessJobForRetrieval. Antwort 200 OK; Fehler propagieren als 500. Der Aufruf läuft ohne Job-Locking parallel zum Timer, siehe Datenflüsse → Watermark.

POST /api/ExecuteHttpRequest

Diagnose-Endpunkt: setzt eine rohe HTTP-GET-Anfrage mit eigenem HttpClient ab, unabhängig von den konfigurierten Connectoren.

FeldDefaultBeschreibung
BaseAddresserforderlichBasis-URL
Urlerforderlichrelativer Pfad inkl. Query
MethodGETnur GET implementiert
AuthenticationNTLMNTLM mit UserName/Password, sonst ohne Credentials
ODataMaxVersion, ODataVersion4.0OData-Header
Preferodata.include-annotations="*"Prefer-Header
MediaTypeWithQualityapplication/jsonAccept-Header

Antwort: 200 OK mit dem rohen Antwort-Body des Zielservers.

GET /api/CheckList

EnsureInitializedAsync → InitializationService.CheckAsync(). Prüft Connections, Job-Connections, eindeutige Order, Mapping-Existenz sowie Tabellen und Felder gegen die Live-Metadaten der Connectoren. Antwort 200 OK mit serialisiertem CheckResponse, auch wenn Befunde vorliegen.

GET /api/Validate

Erzwingt die Initialisierung. 200 OK bei Erfolg, sonst 500; Body text/plain mit InitializationService.GetErrorLogs().

GET /api/job, GET /api/job/{rowKey}

Geladene Jobs (alle bzw. einer). 404, wenn der RowKey unbekannt ist.

GET /api/mapping, GET /api/mapping/{name}

Geladene Mappings. Die Suche läuft über den Mapping-Namen (PartitionKey), Fallback RowKey.

POST /api/mcp

Streamable-HTTP-Endpunkt des MCP-Servers. GET /api/mcp antwortet mit 405, weil kein SSE-Stream angeboten wird. Tools und Nutzung: MCP-Server.

GET /api/StartGetChangesOrchestration

Startet die Durable-Orchestrierung. Antwort 202 Accepted mit der Instance-ID und den Standard-Status-URLs des Durable-Clients.

Trigger-Bindungen

FunctionBindungKonfiguration
GetChangesTimer%GetChangesTimerExpression%, Bicep-Default */15 * * * * *; RunOnStartup nur im Debug-Build
ProcessStandardQueueItemsService BusQueue sbqexport, Connection ExportQueueServiceBus, AutoCompleteMessages = false
ProcessHighPriorityQueueItemsService BusQueue sbqhighexport
ProcessLowPriorityQueueItemsService BusQueue sbqlowexport
GetChangesOrchestratorOrchestrationDurable
GetChangesActivityActivityMaxBatchSize = 3
JobStateEntityAdd, Remove, InProgress, Reset

Die Datei sample.local.settings.json setzt lokal * */2 * * * *. Effektiv gilt immer der App-Setting-Wert der jeweiligen Umgebung.

Nachrichtenschema (Service Bus)

Body: JSON-serialisiertes QueueMessage (Newtonsoft.Json).

FeldTypBeschreibung
IdstringSchlüssel des Quell-Datensatzes
JobNamestringerzeugender Job
ActionCodeJobActionTypeNewUpdate, Delete, TimeStamp, DeleteOnUpdate oder ein InvokeAction-Name
AttributesDictionary<string, QueueMessageProperty>gemappte Werte als Value (string) + TypeName
ModifiedOndatetime?Änderungszeitpunkt der Quelle, Basis für SkipOutdatedMessages
ChangeTrackerstring[JsonIgnore], nur für die Watermark während der Erkennung
NeedToIgnorebool[JsonIgnore]

Application Properties:

PropertyWann gesetzt
JobName, SourceKey, Timestampbeim Senden
ErrorMessage, ErrorTimeStamp, ErrorStackTrace, OperationIdbeim Abandon nach einem Fehler

SourceKey nutzt der DeadLetterMover zur Deduplizierung. OperationId ist die W3C-Root-ID und erlaubt die Korrelation mit Application Insights.

Fehlerverhalten

SituationVerhalten
ExecuteJob ohne JobNameException → 500
InitialisierungsfehlerValidate liefert 500 mit Log; Timer- und Queue-Trigger setzen die Initialisierung zurück und versuchen es beim nächsten Aufruf erneut
Verarbeitungsfehler in ProcessQueueItemsAbandon mit Fehler-Properties; nach maxDeliveryCount in die Dead-Letter-Subqueue
TransitiveException (HTTP 409 im Ziel)Nachricht wird in die Transitive-Queue der Priorität kopiert und im Original abgeschlossen; kein Trigger auf der Transitive-Queue
Veraltete Nachricht bei SkipOutdatedMessagesKopie nach sbqignored, Original abgeschlossen
Wiederholte ZustellungProcessQueueMessageService wartet DeliveryCount² · 1000 ms vor dem Versuch
EndpointNotFoundException, CommunicationException in GetChangesReset der Initialisierung, nächster Timer-Lauf versucht erneut