Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
[Dieser Artikel ist Teil der Dokumentation zur Vorabversion und kann geändert werden.]
Verwenden Sie Hintergrundvorgänge, um Anforderungen zu senden, die Dataverse asynchron verarbeitet. Hintergrundvorgänge sind nützlich, wenn Sie keine Verbindung aufrechterhalten wollen, während eine Anfrage ausgeführt wird.
Wenn ein Hintergrundvorgang abgeschlossen ist, können Sie auf zwei Arten benachrichtigt werden:
- Fügen Sie eine Rückruf-URL mit Ihrer Anforderung ein.
-
Abonnieren Sie das
OnBackgroundOperationCompleteEvent.
Sie können das Ergebnis eines Hintergrundvorgangs auf zwei Arten abrufen:
Um eine Anforderung im Hintergrund auszuführen, muss der Vorgang als benutzerdefinierte API definiert werden. Erfahren Sie, wie Sie benutzerdefinierte APIs erstellen und verwenden und Daten zu benutzerdefinierten APIs abrufen.
Benutzerdefinierte APIs verwenden Plug-Ins zum Ausführen von Datenvorgängen. Wie alle Dataverse-Plug-Ins verfügen diese Plug-Ins über ein Zwei-Minuten-Ausführungstimeout. Das asynchrone Senden der Anforderung bietet keine weitere Ausführungszeit.
Erforderliche Berechtigungen
Zum Ausführen eines Hintergrundvorgangs muss der initiierende Benutzer Lese- und Schreibzugriff auf die backgroundoperations Tabelle haben. Weisen Sie die Berechtigungen prvReadbackgroundoperation und prvWritebackgroundoperation zu, um diesen Zugriff zu gewähren.
- SDK: AddPrivilegesRoleRequest
- Web-API: AddPrivilegesRole-Aktion
Erfahren Sie, wie Sie eine Sicherheitsrolle bearbeiten.
Asynchrone Verarbeitung anfordern
Sie können asynchrone Anforderungen im Hintergrund entweder mit dem SDK für .NET oder der Dataverse-Web-API ausführen.
Beispiele in diesem Artikel verwenden eine benutzerdefinierte API mit dem Namen sample_ExportDataUsingFetchXmlToAnnotation. Diese benutzerdefinierte API wird im Beispiel beschrieben: ExportDataUsingFetchXmlToAnnotation custom API.
Verwenden Sie die ExecuteBackgroundOperation Nachricht.
Das SDK verfügt nicht über ExecuteBackgroundOperation Anforderungs- und Antwortklassen. Verwenden Sie bis zum Hinzufügen dieser Klassen die Basisklassen "OrganizationRequest " und "OrganizationResponse ", wie unter "Verwenden von Nachrichten mit dem SDK für .NET" beschrieben.
In der folgenden Tabelle werden die Eingabeparameter für die ExecuteBackgroundOperation Nachricht beschrieben.
| Name | Typ | Description |
|---|---|---|
Request |
OrganizationRequest | (Erforderlich) Enthält die Anforderung, die Sie asynchron verarbeitet haben möchten. Die Dataverse-Nachricht für die Anforderung muss als benutzerdefinierte API implementiert werden. |
CallbackUri |
Schnur | (Optional) Dataverse sendet eine POST-HTTP-Anforderung an diese URL, wenn der Vorgang abgeschlossen ist. |
In der folgenden Tabelle werden die Ausgabeparameter für die ExecuteBackgroundOperation Nachricht beschrieben.
| Name | Typ | Description |
|---|---|---|
BackgroundOperationId |
Leitfaden | Identifiziert die Tabellenzeile des Hintergrundvorgangs, mit der Sie die Verarbeitung Ihrer Anforderung überwachen oder abbrechen können. |
Location |
Schnur | Identifiziert die Statusüberwachungsressourcen-URL, die Sie zum Abrufen des Status Ihrer Anforderung oder zum Abbrechen verwenden können. |
Die folgende statische Methode verwendet ExecuteBackgroundOperation mit der benutzerdefinierten sample_ExportDataUsingFetchXmlToAnnotation API.
static void SendRequestAsynchronously(IOrganizationService service)
{
//Create a request for message defined as a custom API to run in the background
var asyncRequest = new OrganizationRequest("sample_ExportDataUsingFetchXmlToAnnotation")
{
Parameters =
{
{"FetchXml", @"<fetch>
<entity name='account'>
<attribute name='accountid'/>
<attribute name='name'/>
</entity>
</fetch>" }
}
};
//Create a request to execute the message in the background
var request = new OrganizationRequest("ExecuteBackgroundOperation")
{
Parameters =
{
{"Request", asyncRequest }
}
};
//Execute the background operation request
var response = service.Execute(request);
Console.WriteLine($"BackgroundOperationId: {response["BackgroundOperationId"]}");
Console.WriteLine($"Location: {response["Location"]}");
}
Ausgabe:
BackgroundOperationId: <backgroundoperationid value>
Location: [Organization URI]/api/backgroundoperation/<backgroundoperationid value>
Erfahren Sie mehr über die IOrganizationService-Schnittstelle und die Verwendung von Nachrichten mit dem SDK für .NET.
Verwalten von Hintergrundvorgängen
Wenn Sie eine Anforderung senden, die im Hintergrund verarbeitet werden soll, enthält die Antwort zwei Werte, die unterschiedliche Methoden darstellen, die Sie zum Überwachen oder Abbrechen von Hintergrundvorgängen verwenden können.
Verwenden Sie die ID einer Zeile in der
backgroundoperationsTabelle , um Daten in der Tabelle abzurufen oder zu aktualisieren:Verwenden Sie die
LocationURL, die die Statusüberwachungsressource darstellt, um Hintergrundvorgänge abzufragen und abzubrechen:- Abrufen der Statusüberwachungsressource.
- Senden Sie eine DELETE-Anforderung an die Statusüberwachungsressource.
Von Bedeutung
Die Statusüberwachungs-
backgroundoperationRessource ist nicht die Web-API EntityType-Ressource.URL Example Statusüberwachungsressource [Organization URI]/api/backgroundoperation/<backgroundoperationid value>backgroundoperationEntityType-Ressource[Organization URI]/api/data/v9.2/backgroundoperations(<backgroundoperationid value>)Die Statusüberwachungsressource ist nicht Teil der Dataverse-Web-API. Beachten Sie, dass die URL
/data/v9.2/nicht enthält. Die Statusüberwachungsressource unterstützt nur GET- und DELETE-Vorgänge und hat nicht dasselbe Verhalten wie die Web-API EntityType-Ressourcebackgroundoperation.
Das Abfragen der Hintergrundoperationstabelle oder der Statusüberwachungsressource zum Überprüfen von Anforderungen wird häufig als Statusabfrage bezeichnet. Es wird empfohlen, übermäßige Abfragen zu vermeiden, da sich dies negativ auf die Leistung auswirken kann. Wir empfehlen, Abfrage bei Bedarf in Intervallen von einer Minute oder mehr durchzuführen.
Tabelle mit Hintergrundprozessen
Die Tabelle mit Hintergrundvorgängen enthält Informationen zu Anforderungen, die asynchron verarbeitet werden sollen. Diese Tabelle weist den logischen Namen backgroundoperation und den Entitätssatznamen backgroundoperationsauf.
Erfahren Sie mehr über die backgroundoperation EntityType.
In der folgenden Tabelle werden die Spalten beschrieben, die Sie zum Verwalten des Status von Hintergrundvorgängen verwenden können.
| Anzeigename Schemaname Logischer Name |
Typ | Description |
|---|---|---|
HintergrundvorgangBackgroundOperationIdbackgroundoperationid |
Eindeutiger Bezeichner | Der Primärschlüssel |
Der StatusStateCodebackgroundoperationstatecode |
Auswahlliste | Status des Hintergrundvorgangs Optionen: - Wert: 0, Beschriftung: Bereit- Wert: 2, Bezeichnung: Gesperrt- Wert: 3, Beschriftung: Abgeschlossen |
StatusgrundStatusCodebackgroundoperationstatuscode |
Auswahlliste | Status des Hintergrundvorgangs Optionen: - Wert: , Bezeichnung: 0Warten auf Ressourcen (Status:Bereit)- Wert: , Beschriftung: 20In Bearbeitung (Status:Gesperrt)- Wert: 22, Etikett: Abbrechen (Status:Gesperrt)- Wert: 30, Bezeichnung: Erfolgreich (Status: Abgeschlossen)- Wert: 31, Label: Fehlgeschlagen (Status:Completed)- Wert: 32, Bezeichnung: Abgebrochen (Status:Abgeschlossen) |
NameNamename |
String | Die UniqueName der Custom-API, die für den Vorgang im Hintergrund verwendet wird |
AnzeigenameDisplayNamedisplayname |
String | Die DisplayName der Custom-API, die für den Vorgang im Hintergrund verwendet wird |
Eingabe-ParameterInputParametersinputparameters |
Mitteilung | Die Eingabeparameter, die zum Starten des Hintergrundvorgangs bereitgestellt wurden Diese Zeichenfolge ist ein serialisiertes JSON-Array von Key und Value. |
AusgabeparameterOutputParametersoutputparameters |
Mitteilung | Die Antwort des Hintergrundvorgangs Diese Zeichenfolge ist ein serialisiertes JSON-Array von Key und Value. |
StartzeitStartTimestarttime |
DateTime | Wenn die Ausführung des Hintergrundvorgangs begonnen hat |
EndzeitEndTimeendtime |
DateTime | Wenn die Ausführung des Hintergrundvorgangs beendet ist |
Anzahl der WiederholungsversucheRetryCountretrycount |
Integer | Die Anzahl, wie oft der Vorgang im Hintergrund wiederholt wurde |
FehlercodeErrorCodeerrorcode |
Integer | Der Fehlercode, wenn der Hintergrundvorgang fehlschlägt Wenn der Fehler von Dataverse stammt, weist er einen ganzzahligen Wert auf, der einem der codes entspricht, die in Webdienstfehlercodes aufgeführt sind. Wenn der Fehler nicht von Dataverse stammt, wird der Wert auf Null festgelegt. |
FehlermeldungErrorMessageerrormessage |
Mitteilung | Fehlermeldung, wenn der Hintergrundvorgang fehlschlägt |
Ausführen alsRunAsrunas |
String | Die systemuserid der der systemuser, die zum Ausführen des Hintergrundvorgangs verwendet werden |
Erstellt amCreatedOncreatedon |
DateTime | Zeitpunkt der Erstellung des Datensatzes |
Zeit zum LebenTTLInSecondsttlinseconds |
Integer | Lebensdauer in Sekunden, nach deren Ablauf der Datensatz automatisch gelöscht wird, wobei der Standardwert 90 Tage beträgt. |
Abfrage der Tabelle der Hintergrundvorgänge
Stellen Sie sicher, dass Sie diese Spalten in Ihre Abfrage einschließen:
namebackgroundoperationstatecodebackgroundoperationstatuscodeoutputparameterserrorcodeerrormessage
Wie Sie die Tabelle abfragen, hängt davon ab, ob Sie das SDK oder die Web-API verwenden.
static void PollBackgroundOperationRequest(IOrganizationService service, Guid backgroundOperationId)
{
// List of columns that will help to get status, output and error details if any
var columnSet = new ColumnSet(
"name",
"backgroundoperationstatecode",
"backgroundoperationstatuscode",
"outputparameters",
"errorcode",
"errormessage");
try
{
// Get the entity with all the required columns
var backgroundOperation = service.Retrieve("backgroundoperation", backgroundOperationId, columnSet);
Console.WriteLine($"Name: {backgroundOperation["name"]}");
Console.WriteLine($"State Code: {backgroundOperation.FormattedValues["backgroundoperationstatecode"]}");
Console.WriteLine($"Status Code: {backgroundOperation.FormattedValues["backgroundoperationstatuscode"]}");
Console.WriteLine($"Output Parameters:");
// Deserialize the Output Parameters into KeyValuePair<string, string>
List<KeyValuePair<string, string>>? output =
System.Text.Json.JsonSerializer
.Deserialize<List<KeyValuePair<string, string>>>((string)backgroundOperation["outputparameters"]);
output.ForEach(x => {
Console.WriteLine($"\t{x.Key}: {x.Value}");
});
Console.WriteLine($"Error Code: {backgroundOperation.GetAttributeValue<string>("errorcode")}");
Console.WriteLine($"Error Message: {backgroundOperation.GetAttributeValue<string>("errormessage")}");
}
// Catch Dataverse errors
catch (FaultException<OrganizationServiceFault> ex)
{
Console.WriteLine($"ErrorCode:{ex.Detail.ErrorCode}");
Console.WriteLine($"Message:{ex.Detail.Message}");
}
// Catch other errors
catch (Exception error)
{
Console.WriteLine($"Some other error occurred: '{error.Message}'");
}
}
Wartende Ausgabe:
Name: sample_ExportDataUsingFetchXmlToAnnotation
State Code: Locked
Status Code: In Progress
Output Parameters:
Error Code:
Error Message:
Vollständige Ausgabe:
Name: sample_ExportDataUsingFetchXmlToAnnotation
State Code: Completed
Status Code: Succeeded
Output Parameters:
AnnotationId: {value}
Error Code:
Error Message:
Fehlerausgabe:
Name: sample_ExportDataUsingFetchXmlToAnnotation
State Code: Completed
Status Code: Failed
Output Parameters:
Error Code: -2147187707
Error Message: Access is denied.
Wenn die Plattform den Fehler erzeugt, weist sie einen ganzzahligen Wert auf, der einem der codes entspricht, die in den Webdienstfehlercodes aufgeführt sind. Wenn die Plattform den Fehler nicht erzeugt, wird der Wert auf Null festgelegt.
ID nicht gefunden:
ErrorCode:-2147185406
Message:The HTTP status code of the response was not expected (404).
Status: 404
Response:
{"error":{"message":"Could not find item '110eaa68-db17-4115-ad74-d185823fc089'.","details":[{"message":"\r\nErrors : [\r\n \"Resource Not Found. Learn more: https://aka.ms/cosmosdb-tsg-not-found\"\r\n]\r\n"}]}}
Die Statusmonitorressource abrufen
Sie können die Statusüberwachungsressource mit einer GET-Anforderung abrufen, die den Status des Hintergrundvorgangs zurückgibt. Wenn der Vorgang abgeschlossen ist, wird die Ausgabe der benutzerdefinierten API bereitgestellt. Wenn während der Ausführung ein Fehler aufgetreten ist, wird eine Fehlermeldung und ein Code angezeigt.
Senden Sie eine Anforderung an die URL der Statusmonitorressource, die mit zurückgegeben wurde der Location-Antwortheader der ursprünglichen Anforderung.
Anforderung:
GET [Organization URI]/api/backgroundoperation/{backgroundoperationid}
Content-Type: application/json
Antwort:
HTTP/1.1 200 OK
Content-Type: application/json
{
backgroundOperationErrorCode: {INT},
backgroundOperationErrorMessage: {string},
backgroundOperationStateCode: {INT},
backgroundOperationStatusCode: {INT},
outputParam1: {value},
outputParam2: {value},
outputParam3: {value},
}
backgroundOperationErrorCode und backgroundOperationErrorMessage Werte werden nur einbezogen, wenn ein Fehler auftritt. Ausgabeparameter sind nur enthalten, wenn der Vorgang erfolgreich abgeschlossen wird.
Bezeichnungen sind mit der Statusmonitor-Ressource nicht verfügbar.
Empfangen einer Benachrichtigung über das Ergebnis
Um eine Benachrichtigung zu erhalten, wenn ein Hintergrundvorgang abgeschlossen ist, können Sie entweder eine Rückruf-URL mit Ihrer Anforderung einschließen oder das OnBackgroundOperationComplete Ereignis abonnieren.
Anfordern eines Rückrufs
Sie können eine URL in Ihrer Anforderung angeben, um einen Rückruf zu erhalten, wenn der Vorgang abgeschlossen ist. Dataverse verwendet diese URL, um eine POST-Anforderung mit der folgenden Nutzlast zu senden:
{
"location": "< status monitor resource URL >",
"backgroundOperationId": "{GUID}",
"backgroundOperationStateCode": {INT},
"backgroundOperationStatusCode": {INT},
"backgroundOperationErrorCode": {INT},
"backgroundOperationErrorMessage": {string},
}
backgroundOperationErrorCode und backgroundOperationErrorMessage sind nur enthalten, wenn ein Fehler auftritt.
Die Rufrufnutzdaten enthalten keine Ausgabeparameter. Die Website, die den Rückruf empfängt, muss eine authentifizierte GET-Anforderung mithilfe der Statusüberwachungsressourcen-URL senden, um Ergebnisse zu erhalten.
Wenn die URL eine Authentifizierung erfordert, muss es sich um eine eigenständige SAS-URL (Shared Access Signature) sein. Es ist nicht möglich, weitere Header einzuschließen, um API-Schlüssel oder Token für die Authentifizierung einzuschließen.
Sie können eine Website wie webhook.site verwenden, um die Rückruf-URL zu testen.
Wie Sie einen Rückruf anfordern, hängt davon ab, ob Sie das SDK oder die Web-API verwenden. In den folgenden Beispielen wird eine Anforderung mithilfe eines Webhooks zum Testen an webhook.site gesendet.
Legen Sie mit dem SDK den ExecuteBackgroundOperation.CallbackUri Parameter auf die URL fest, um die Anforderung zu senden.
static void SendRequestAsynchronouslyWithCallback(IOrganizationService service)
{
//Create a request for message defined as a custom API to run in the background
var asyncRequest = new OrganizationRequest("sample_ExportDataUsingFetchXmlToAnnotation")
{
Parameters =
{
{"FetchXml", @"<fetch>
<entity name='account'>
<attribute name='accountid'/>
<attribute name='name'/>
</entity>
</fetch>" }
}
};
//Create a request to execute the message in the background
var request = new OrganizationRequest("ExecuteBackgroundOperation")
{
Parameters =
{
{"Request", asyncRequest },
// Request a callback
{"CallbackUri", "https://webhook.site/<id>" }
}
};
//Execute the background operation request
var response = service.Execute(request);
Console.WriteLine($"BackgroundOperationId: {response["BackgroundOperationId"]}");
Console.WriteLine($"Location: {response["Location"]}");
}
Abonnieren des OnBackgroundOperationComplete-Ereignisses
Eine weitere Möglichkeit zum Empfangen einer Benachrichtigung, wenn ein Hintergrundvorgang abgeschlossen ist, besteht darin, einen Schritt in der OnBackgroundOperationComplete Nachricht zu registrieren. Diese Nachricht ist eine benutzerdefinierte API, die nur asynchrone Schrittregistrierungen zulässt. Es ist ein Beispiel für den Typ von Nachrichten, die mit einer benutzerdefinierten API erstellt wurden, um Geschäftsereignisse darzustellen.
Wie der Name schon sagt, tritt das OnBackgroundOperationComplete-Ereignis jedes Mal auf, wenn ein Hintergrundvorgang abgeschlossen ist. Wenn Sie einen asynchronen Schritt für dieses Ereignis registrieren, können Sie einen beliebigen Logiktyp in einem Plug-In ausführen oder die Daten an Azure-Dienste oder einen Webhook weiterleiten. Weitere Informationen:
- Registrieren eines Plug-Ins
- Azure-Integration
- Arbeiten mit Microsoft Dataverse-Ereignisdaten in Ihrer Azure Event Hubs-Lösung
- Verwenden von Webhooks zum Erstellen externer Handler für Serverereignisse
In den folgenden Tabellen werden die Eingabe- und Ausgabeparameter für die OnBackgroundOperationComplete Nachricht beschrieben.
Eingabeparameter:
| Name | Typ | Description |
|---|---|---|
PayloadType |
Integer | Welche Art von Antwort an den Rückruf-URI gesendet wird, wenn der Hintergrundvorgang abgeschlossen ist; immer Null für Hintergrundvorgänge Dieses Feld ist intern und sollte nicht aktualisiert werden. |
LocationUrl |
String | Standort-URL |
BackgroundOperationId |
Leitfaden | Die ID des Hintergrundvorgangs |
Ausgabeparameter:
| Name | Typ | Description |
|---|---|---|
OperationName |
String | Vorgangsname |
BackgroundOperationStateCode |
Integer | Code für Hintergrundbetriebsstatus |
BackgroundOperationStatusCode |
Integer | Statuscode für Hintergrundvorgänge |
Konfigurieren Sie die OnBackgroundOperationComplete Nachricht wie in den Anweisungen zum Registrieren eines Plug-Ins dargestellt. Stellen Sie sicher, dass Sie den Nachrichtennamen als OnBackgroundOperationComplete festlegen. Legen Sie die automatische Löschung so true fest, dass der Systemauftragseintrag (AsyncOperation) automatisch entfernt wird.
Abbrechen von Hintergrundvorgängen
Sie können einen Hintergrundvorgang abbrechen, den Sie initiiert haben, wenn er nicht gestartet wurde.
- Wenn der Vorgang nicht gestartet wurde, führt Dataverse ihn nicht aus.
- Wenn der Vorgang gestartet wurde, beendet Dataverse ihn nicht.
- Wenn während der Ausführung eines abgebrochenen Hintergrundvorgangs ein Fehler auftritt, wird es von Dataverse nicht wiederholt.
- Wenn der Vorgang bereits abgeschlossen ist, wird die folgende Fehlermeldung angezeigt:
Canceling background operation is not allowed after it is in terminal state.
Sie können einen Hintergrundvorgang auf zwei Arten abbrechen:
- Abbrechen eines Hintergrundvorgangs durch Aktualisieren von Hintergrundoperationen
- Senden einer DELETE-Anforderung an die Statusüberwachungsressource
Abbrechen eines Hintergrundvorgangs durch Aktualisieren von Hintergrundoperationen
Aktualisieren Sie die Zeile in der backgroundoperations Tabelle, um backgroundoperationstatecode auf 2 (gesperrt) und backgroundoperationstatuscode auf 22 (Stornieren) festzulegen.
Wie Sie die backgroundoperations Tabelle aktualisieren, hängt davon ab, ob Sie das SDK oder die Web-API verwenden.
static void CancelBackgroundOperationRequest(
IOrganizationService service,
Guid backgroundOperationId)
{
var backgroundOperation = new Entity(
entityName: "backgroundoperation",
id: backgroundOperationId)
{
Attributes =
{
//Set state as Locked
{"backgroundoperationstatecode", new OptionSetValue(2) },
//Set status as Cancelling
{"backgroundoperationstatuscode", new OptionSetValue(22) }
}
};
service.Update(backgroundOperation);
}
Senden Sie eine DELETE-Anforderung an die Statusüberwachungsressource
Sie können einen Hintergrundvorgang auch abbrechen, indem Sie eine DELETE-Anforderung an die Statusüberwachungsressource senden.
Anforderung:
DELETE [Organization URI]/api/backgroundoperation/{backgroundoperationid}
Antwort:
HTTP/1.1 200 Ok
{
backgroundOperationStateCode: 2,
backgroundOperationStatusCode: 22
}
Wiederholungen
Wenn während der Ausführung der Anforderung ein Fehler auftritt, wird sie bis zu drei Mal wiederholt. Diese Wiederholungen verwenden eine exponentielle Backoff-Strategie.