Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
La capacidad de ampliar el comportamiento predeterminado de Microsoft Dataverse depende de detectar cuándo se producen eventos en el servidor. Event Framework proporciona la capacidad de registrar código personalizado que se va a ejecutar en respuesta a eventos específicos.
Todas las funcionalidades para ampliar el comportamiento predeterminado de la plataforma dependen del marco de eventos. Al configurar un flujo de trabajo para responder a un evento mediante el diseñador de flujo de trabajo sin escribir código, el marco de eventos proporciona ese evento.
Como desarrollador, usará la herramienta de registro de complementos para configurar complementos, integraciones de Azure, proveedores de datos de tabla virtual y webhooks para responder a los eventos proporcionados por el marco de eventos. Cuando se producen eventos y se registra una extensión para responder a ellos, se pasa información contextual sobre los datos implicados en la operación a la extensión. En función de cómo se configure el registro del evento, la extensión puede modificar los datos pasados, iniciar algún proceso automatizado para que se aplique inmediatamente o definir que se agrega una acción a una cola para que se realice más adelante.
Para aprovechar el marco de eventos de las extensiones personalizadas, debe comprender lo siguiente:
- Qué eventos están disponibles
- Cómo se procesa el evento
- ¿qué tipo de datos están disponibles para la extensión personalizada cuando se produce el evento?
- ¿Qué limitaciones de tiempo y recursos se aplican?
- Supervisión del rendimiento
Eventos disponibles
Como se describe en Uso de mensajes con el SDK para .NET, las operaciones de datos en la plataforma de Dataverse se basan en mensajes y cada mensaje tiene un nombre. Hay Create, Retrieve, RetrieveMultiple, Update, Delete, Associate y Disassociate mensajes que cubren las operaciones básicas de datos que se producen con tablas. También hay mensajes especializados para operaciones más complejas y las acciones personalizadas agregan nuevos mensajes.
Cuando use la herramienta Registro de complementos para asociar una extensión a un mensaje determinado, la registrará como paso. La captura de pantalla siguiente es el cuadro de diálogo Registrar nuevo paso que se usa al registrar un complemento.
Un paso proporciona la información sobre el mensaje al que deben responder las extensiones, así como otras opciones de configuración. Use el campo Mensaje para elegir el mensaje al que responderá la extensión.
Por lo general, puede esperar encontrar un mensaje para la mayoría de las clases *Request en los espacios de nombres Microsoft.Crm.Sdk.Messages o Microsoft.Xrm.Sdk.Messages, pero también encontrará mensajes para cualquier acción personalizada que se haya creado en la organización. Las operaciones que impliquen definiciones de tabla no están disponibles.
Los datos sobre los mensajes se almacenan en las tablas SdkMessage y SdkMessageFilter . La herramienta de registro del complemento filtrará esta información para mostrar solo mensajes válidos.
Para comprobar si una combinación de mensajes y tablas admite la ejecución de complementos mediante una consulta de base de datos, puede usar la siguiente consulta de API web:
[Organization URI]/api/data/v9.1/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
Sugerencia
Puede exportar estos datos a una hoja de cálculo de Excel mediante esta consulta y las instrucciones proporcionadas en esta entrada de blog: Buscar mensajes y tablas aptos para complementos mediante Dataverse
También puede usar el siguiente FetchXML para recuperar esta información. FetchXML Builder es una herramienta útil para ejecutar este tipo de consulta.
<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>
Precaución
El mensaje Execute está disponible, pero no debe registrar extensiones para él, ya que es invocado por cada operación.
Nota:
Hay algunos casos en los que se pueden llamar dos veces a complementos y flujos de trabajo registrados para el evento de actualización. Más información: Comportamiento de operaciones de actualización especializadas
Canalización de ejecución de eventos
Al registrar un paso mediante la Herramienta de registro de complementos también debe elegir la Fase de la canalización de eventos de ejecución. Cada mensaje se procesa en una serie de 4 fases, como se describe en la tabla siguiente:
| Nombre | Description |
|---|---|
| Prevalidación | Para la operación inicial, esta fase se producirá antes de la operación del sistema principal. Esto proporciona la oportunidad de incluir lógica para cancelar la operación antes de la transacción de la base de datos. Las operaciones posteriores desencadenadas por extensiones registradas en otras fases también pasarán a través de esta fase, pero también se incluirán dentro de la transacción de las extensiones de llamada. Esta fase se produce antes de que las comprobaciones de seguridad estén preformadas para comprobar que el usuario que realiza la llamada o que ha iniciado sesión tiene el permiso correcto para realizar la operación prevista. |
| PreOperation | Se produce antes de la operación principal del sistema y dentro de la transacción de base de datos. Si desea cambiar los valores de una entidad incluida en el mensaje, debe hacerlo aquí. Evite cancelar una operación aquí. La cancelación desencadenará una reversión de la transacción y tendrá un impacto significativo en el rendimiento. |
| OperaciónPrincipal | Para uso interno únicamente, excepto para los proveedores de datos de tablas virtuales personalizadas y las API personalizadas. Más información: Crear y usar API personalizadas Proveedores de datos de tabla virtual personalizados |
| PostOperation | Se produce después de la operación principal del sistema y dentro de la transacción de base de datos. Use esta fase para modificar las propiedades del mensaje antes de que se devuelva al autor de la llamada. Evite aplicar cambios a una entidad incluida en el mensaje porque desencadenará un nuevo evento Update. En la fase PostOperation puede registrar los pasos para usar el modo de ejecución asincrónica. Estos pasos se ejecutarán fuera de la transacción de base de datos mediante el servicio asincrónico. Debe usar el modo asincrónico al registrar su complemento si está diseñado para realizar una operación de actualización y se registra en el mensaje de Creación de la entidad User (SystemUser). Más información: Servicio asincrónico. |
La fase que debe elegir depende del propósito de la extensión. No es necesario aplicar toda la lógica de negocios en un solo paso. Puede aplicar varios pasos para que la lógica sobre si se permite que una operación continúe puede estar en la fase PreValidation y la lógica para realizar modificaciones en las propiedades del mensaje puede producirse en la fase PostOperation .
Importante
Una excepción lanzada por el código en cualquier etapa sincrónica dentro de la transacción de base de datos hará que se revierta toda la transacción. Debe tener cuidado para asegurarse de que su código maneja los posibles casos de excepción. Si desea cancelar la operación, debe detectarlo en la fase PreValidation y solo lanzar un InvalidPluginExecutionException que contenga un mensaje adecuado que describa por qué se canceló la operación.
Se pueden registrar varias extensiones para el mismo mensaje y fase. Dentro del registro de pasos, el valor del orden de ejecución determina el orden en el que se deben procesar varias extensiones para una fase determinada.
La información sobre los pasos registrados se almacena en la tabla SdkMessageProcessingStep.
Pasos del complemento asincrónico
Al registrarse en la fase PostOperation , tiene la opción de registrar el paso para ejecutarse en modo de ejecución asincrónica. Estos complementos se ejecutarán una vez completada la operación de registro.
Esto suele ser necesario cuando se trabaja con registros asociados al registro actual, pero se crean en un proceso diferente. Por ejemplo, UserSettings relacionado con un SystemUser no se creará hasta que se cree la fila SystemUser.
Más información: Servicio asincrónico
Contexto de evento
Si la extensión es un complemento, recibirá un parámetro que implementa la IPluginExecutionContext interfaz. Esta clase proporciona información sobre la Stage para el que está registrado el complemento, así como información sobre el ParentContext que proporciona información sobre cualquier operación en otro complemento que activó la operación actual.
Si la extensión es un punto de conexión de Azure Service Bus, un tópico de Azure EventHub o un webhook, los datos que se publicarán en el punto de conexión registrado estarán en forma de un RemoteExecutionContext que implementa ambos IPluginExecutionContext y IExecutionContext.
Para obtener más información sobre el contexto de ejecución, lea Descripción del contexto de ejecución.