Freigeben über


Vorgänge im Hintergrund (Vorschauversion)

[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:

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.

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.

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
Hintergrundvorgang
BackgroundOperationId
backgroundoperationid
Eindeutiger Bezeichner Der Primärschlüssel
Der Status
StateCode
backgroundoperationstatecode
Auswahlliste Status des Hintergrundvorgangs

Optionen:
- Wert: 0, Beschriftung: Bereit
- Wert: 2, Bezeichnung: Gesperrt
- Wert: 3, Beschriftung: Abgeschlossen
Statusgrund
StatusCode
backgroundoperationstatuscode
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)
Name
Name
name
String Die UniqueName der Custom-API, die für den Vorgang im Hintergrund verwendet wird
Anzeigename
DisplayName
displayname
String Die DisplayName der Custom-API, die für den Vorgang im Hintergrund verwendet wird
Eingabe-Parameter
InputParameters
inputparameters
Mitteilung Die Eingabeparameter, die zum Starten des Hintergrundvorgangs bereitgestellt wurden

Diese Zeichenfolge ist ein serialisiertes JSON-Array von Key und Value.
Ausgabeparameter
OutputParameters
outputparameters
Mitteilung Die Antwort des Hintergrundvorgangs

Diese Zeichenfolge ist ein serialisiertes JSON-Array von Key und Value.
Startzeit
StartTime
starttime
DateTime Wenn die Ausführung des Hintergrundvorgangs begonnen hat
Endzeit
EndTime
endtime
DateTime Wenn die Ausführung des Hintergrundvorgangs beendet ist
Anzahl der Wiederholungsversuche
RetryCount
retrycount
Integer Die Anzahl, wie oft der Vorgang im Hintergrund wiederholt wurde
Fehlercode
ErrorCode
errorcode
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.
Fehlermeldung
ErrorMessage
errormessage
Mitteilung Fehlermeldung, wenn der Hintergrundvorgang fehlschlägt
Ausführen als
RunAs
runas
String Die systemuserid der der systemuser, die zum Ausführen des Hintergrundvorgangs verwendet werden
Erstellt am
CreatedOn
createdon
DateTime Zeitpunkt der Erstellung des Datensatzes
Zeit zum Leben
TTLInSeconds
ttlinseconds
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:

  • name
  • backgroundoperationstatecode
  • backgroundoperationstatuscode
  • outputparameters
  • errorcode
  • errormessage

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:

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

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.