Freigeben über


Ereignisframework in Microsoft Dataverse

Mit dem Microsoft Dataverse-Ereignisframework können Sie erkennen, wann Ereignisse auf dem Server auftreten und benutzerdefinierten Code als Reaktion ausführen. Verwenden Sie das Ereignisframework, um das Standardverhalten der Plattform zu erweitern, indem Sie Plug-Ins, Workflows, Azure-Integrationen und Webhooks registrieren.

Alle Funktionen zum Erweitern des Standardverhaltens der Plattform hängen vom Ereignisframework ab. Wenn Sie einen Workflow so konfigurieren, dass er auf ein Ereignis mit dem Workflow-Designer reagiert, ohne Code zu schreiben, stellt das Ereignisframework dieses Ereignis bereit.

Verwenden Sie als Entwickler das Plug-In-Registrierungstool, um Plug-Ins , Azure-Integrationen, Anbieter für virtuelle Tabellendaten und Webhooks zu konfigurieren, um auf Ereignisse zu reagieren, die das Ereignisframework bereitstellt. Wenn Ereignisse auftreten und Sie eine Erweiterung registrieren, um darauf zu reagieren, übergibt das Framework kontextbezogene Informationen zu den Daten, die am Vorgang beteiligt sind, an die Erweiterung. Je nachdem, wie Sie die Registrierung für das Ereignis konfigurieren, kann die Erweiterung die darin übergebenen Daten ändern, einen automatisierten Prozess initiieren, der sofort angewendet wird, oder definieren, dass eine Aktion zu einer Warteschlange hinzugefügt wird, die später ausgeführt werden soll.

Um das Ereignisframework für Ihre benutzerdefinierten Erweiterungen zu nutzen, müssen Sie Folgendes verstehen:

  • Welche Ereignisse verfügbar sind
  • Wie das Ereignis verarbeitet wird
  • Welche Art von Daten für Ihre benutzerdefinierte Erweiterung verfügbar ist, wenn das Ereignis auftritt
  • Welche Zeit- und Ressourcenbeschränkungen gelten
  • Wie man die Leistung überwacht

Folgende Ereignisse sind verfügbar

Wie unter "Verwenden von Nachrichten mit dem SDK für .NET" beschrieben, basiert die Dataverse-Plattform auf Datenvorgängen auf Nachrichten, und jede Nachricht hat einen Namen. Die Plattform umfasst Create, Retrieve, RetrieveMultiple, Update, Delete, Associate und Disassociate Nachrichten, die die grundlegenden Datenvorgänge abdecken, die bei Tabellen auftreten. Die Plattform enthält auch spezielle Nachrichten für komplexere Vorgänge, und benutzerdefinierte Aktionen fügen neue Nachrichten hinzu.

Wenn Sie das Plug-In-Registrierungstool verwenden, um eine Erweiterung einer bestimmten Nachricht zuzuordnen, registrieren Sie sie als Schritt. Der folgende Screenshot ist das Dialogfeld " Neuer Schritt registrieren ", das beim Registrieren eines Plug-Ins verwendet wird.

Screenshot des Dialogfelds

In einem Schritt werden die Informationen darüber bereitgestellt, auf welche Nachricht die Erweiterungen reagieren sollen, sowie eine Reihe weiterer Konfigurationsoptionen. Verwenden Sie das Feld "Nachricht ", um die Nachricht auszuwählen, auf die Ihre Erweiterung antwortet.

Im Allgemeinen können Sie davon ausgehen, dass sie eine Nachricht für die meisten Anforderungsklassen in den Microsoft.Crm.Sdk.Messages Oder Microsoft.Xrm.Sdk.Messages Namespaces finden. Außerdem finden Sie Nachrichten für alle benutzerdefinierten Aktionen, die Sie in der Organisation erstellen. Die Plattform stellt keine Vorgänge zur Verfügung, die Tabellendefinitionen umfassen.

Das System speichert Daten zu Nachrichten in den Tabellen SdkMessage und SdkMessageFilter . Das Plug-In-Registrierungstool filtert diese Informationen so, dass nur gültige Nachrichten angezeigt werden.

Um zu überprüfen, ob eine Nachrichten- und Tabellenkombination die Ausführung von Plug-Ins mithilfe einer Datenbankabfrage unterstützt, verwenden Sie die folgende Web-API-Abfrage:

[Organization URI]/api/data/v9.2/sdkmessages?$select=name
&$filter=isprivate eq false 
and (name ne 'SetStateDynamicEntity' 
and name ne 'RemoveRelated' 
and name ne 'SetRelated' and 
name ne 'Execute') 
and sdkmessageid_sdkmessagefilter/any(s:s/iscustomprocessingstepallowed eq true 
and s/isvisible eq true)
&$expand=sdkmessageid_sdkmessagefilter($select=primaryobjecttypecode;
$filter=iscustomprocessingstepallowed eq true and isvisible eq true)
&$orderby=name

Tipp

Sie können diese Daten mithilfe dieser Abfrage und der anweisungen in diesem Blogbeitrag in ein Excel-Arbeitsblatt exportieren: Suchen sie Nachrichten und Tabellen, die für Plug-Ins berechtigt sind, mithilfe der Dataverse.

Sie können auch das folgende FetchXML verwenden, um diese Informationen abzurufen. Der FetchXML Builder ist ein nützliches Tool zum Ausführen dieser Art von Abfrage.

<fetch>
  <entity name='sdkmessage'>
    <attribute name='name' />
    <link-entity name='sdkmessagefilter'
      alias='filter'
      to='sdkmessageid'
      from='sdkmessageid'
      link-type='inner'>
      <filter type='and'>
        <condition attribute='iscustomprocessingstepallowed' 
          operator='eq' 
          value='1' />
        <condition attribute='isvisible' 
          operator='eq' 
          value='1' />
      </filter>
      <attribute name='primaryobjecttypecode' />
    </link-entity>
    <filter>
      <condition attribute='isprivate' 
        operator='eq' 
        value='0' />
      <condition attribute='name' 
        operator='not-in'>
        <value>SetStateDynamicEntity</value>
        <value>RemoveRelated</value>
        <value>SetRelated</value>
        <value>Execute</value>
      </condition>
    </filter>
    <order attribute='name' />
  </entity>
</fetch>

Vorsicht

Die Execute Nachricht ist verfügbar, Sie sollten jedoch keine Erweiterungen dafür registrieren, da jeder Vorgang sie aufruft.

Hinweis

In bestimmten Fällen kann die Plattform Plug-Ins und Workflows aufrufen, die Sie zweimal für das Update-Ereignis registrieren. Weitere Informationen finden Sie unter Verhalten spezieller Updatevorgänge.

Ereignisausführungspipeline

Wenn Sie einen Schritt mithilfe des Plug-In-Registrierungstools registrieren, müssen Sie auch die Ereignispipelinephase der Ausführung auswählen. Jede Nachricht wird in einer Reihe von vier Phasen verarbeitet, wie in der folgenden Tabelle beschrieben:

Name Description
PreValidation Beim Erstbetrieb tritt diese Phase vor dem Betrieb des Hauptsystems auf.

Auf diese Weise kann Logik eingebunden werden, mit der sich der Vorgang vor der Datenbanktransaktion abbrechen lässt.

Nachfolgende Vorgänge, die von Erweiterungen ausgelöst werden, die in anderen Phasen registriert sind, passieren diese Phase auch, werden aber in die Transaktion der aufrufenden Erweiterungen aufgenommen.

Diese Phase tritt vor der Durchführung sämtlicher Sicherheitsprüfungen auf, um zu überprüfen, ob der aufrufende oder angemeldete Benutzer berechtigt ist, den gewünschten Vorgang durchzuführen.
PreOperation Tritt vor Betrieb des Hauptsystems und während der Datenbanktransaktion auf.

Wenn Sie die Werte einer in einer Nachricht enthaltenen Entität ändern möchten, tun Sie dies hier.

Brechen Sie an dieser Stelle besser keinen Vorgang ab. Andernfalls wird die Transaktion rückabgewickelt, und es kommt zu erheblichen Leistungseinbußen.
Hauptoperation Nur für die interne Verwendung mit Ausnahme von benutzerdefinierten API- und benutzerdefinierten Datenanbietern für virtuelle Tabellen.
Weitere Informationen:
Benutzerdefinierte APIs erstellen und verwenden
Benutzerdefinierte Anbieter für virtuelle Tabellendaten
PostOperation Tritt nach Betrieb des Hauptsystems und während der Datenbanktransaktion auf.

Mit dieser Phase können Sie die Eigenschaften der Nachricht ändern, bevor sie an den Anrufer zurückgeht.

Die Entitäten in einer Nachricht sollten nicht geändert werden, weil das ein neues Update-Ereignis auslöst.

In der PostOperation-Phase können Sie Schritte zur Nutzung des asynchronen Ausführungsmodus aufzeichnen. Diese Schritte erfolgen mithilfe des asynchronen Dienstes außerhalb der Datenbanktransaktion.

Sie müssen beim Registrieren Ihres Plug-Ins den asynchronen Modus verwenden, wenn das Plug-In für die Durchführung eines Aktualisierungsvorgangs konzipiert ist und in der Nachricht „Create” der Entität User (SystemUser) registriert ist.

Weitere Informationen:Asynchroner Dienst.

Die ausgewählte Phase hängt vom Zweck der Erweiterung ab. Sie müssen nicht alle Geschäftslogik innerhalb eines einzelnen Schritts anwenden. Sie können mehrere Schritte anwenden, damit Ihre Logik darüber, ob ein Vorgang fortgesetzt werden kann, in der PreValidation-Phase enthalten sein kann, und Ihre Logik zum Vornehmen von Änderungen an den Nachrichteneigenschaften kann in der PostOperation-Phase auftreten.

Von Bedeutung

Eine Ausnahme, die von Ihrem Code in einer synchronen Phase innerhalb der Datenbanktransaktion ausgelöst wird, bewirkt, dass die gesamte Transaktion zurückgerollt wird. Stellen Sie sicher, dass ihr Code mögliche Ausnahmefälle behandelt. Wenn Sie den Vorgang abbrechen möchten, erkennen Sie diese Bedingung in der PreValidation-Phase , und lösen Sie eine InvalidPluginExecutionException entsprechende Meldung aus, die beschreibt, warum der Vorgang abgebrochen wurde.

Sie können mehrere Erweiterungen für dieselbe Nachricht und Stufe registrieren. Innerhalb der Schrittregistrierung bestimmt der Wert der Ausführungsreihenfolge die Reihenfolge, in der das System mehrere Erweiterungen für eine bestimmte Phase verarbeitet.

Das System speichert Informationen zu registrierten Schritten in der Tabelle "SdkMessageProcessingStep".

Asynchrone Plug-In-Schritte

Wenn Sie sich für die PostOperation-Phase registrieren, können Sie den Schritt registrieren, der im asynchronen Ausführungsmodus ausgeführt werden soll. Diese Plug-Ins werden nach Abschluss des Aufzeichnungsvorgangs ausgeführt.

Dieses Verhalten ist häufig erforderlich, wenn Sie mit Datensätzen arbeiten, die dem aktuellen Datensatz zugeordnet sind, aber in einem anderen Prozess erstellt wurden. Beispielsweise wird ein zu einem bestimmten SystemUser-Datensatz gehörendes UserSettings erst erstellt, wenn die SystemUser-Zeile erstellt wird.

Weitere Informationen: Asynchroner Dienst

Ereigniskontext

Wenn ihre Erweiterung ein Plug-In ist, empfängt sie einen Parameter, der die IPluginExecutionContext Schnittstelle implementiert. Diese Klasse stellt Informationen über das Stage bereit, für das das Plug-In registriert wird. Darüber hinaus enthält sie Informationen über das ParentContext, was Details zu jedem Vorgang innerhalb eines anderen Plug-Ins gibt, das den aktuellen Vorgang ausgelöst hat.

Wenn Es sich bei Ihrer Erweiterung um einen Azure Service Bus-Endpunkt, ein Azure Event Hubs-Thema oder einen Web-Hook handelt, werden die im registrierten Endpunkt bereitgestellten Daten in Form eines RemoteExecutionContext. Diese Klasse implementiert sowohl IPluginExecutionContext als auch IExecutionContext.

Weitere Informationen zum Ausführungskontext finden Sie unter Grundlegendes zum Ausführungskontext.