Compartir a través de


Utilice webhooks para crear controladores externos para eventos de servidor

Comenzando con las aplicaciones de Dynamics 365 for Customer Engagement versión 9.0, puede enviar datos sobre eventos que tienen lugar en el servidor a una aplicación web mediante webhooks. Webhooks es un patrón HTTP ligero para conectar servicios y API web con un modelo de publicación/suscripción. Los remitentes de webhook envían a los receptores notificaciones sobre eventos realizando solicitudes a los extremos de los receptores con información sobre los eventos.

Los webhooks permiten a desarrolladores e ISV integrar datos de Customer Engagement en su propio código personalizado hospedado en servicios externos. Con el modelo de webhooks, puede proteger el extremo usando un encabezado de autenticación o claves de parámetro de string de consulta. Esto es más sencillo que el modelo de autenticación SAS que se puede usar actualmente para la integración de Azure Service Bus.

Cuando decida entre el modelo de webhook y la integración de Azure Service Bus, aquí se muestran algunos elementos a tener en cuenta:

  • Azure Service Bus funciona para un procesamiento de alta escala y proporciona un mecanismo completo de puesta en cola si Dynamics 365 está impulsando muchos eventos.
  • Los webhooks solo pueden escalar hasta el punto en el que su servicio web hospedado pueda manejar los mensajes.
  • Los webhooks permiten pasos sincrónicos y asincrónicos. Azure Service Bus solo permite pasos asincrónicos.
  • Los webhooks envian solicitudes POST con carga JSON y pueden ser consumidos por cualquier lenguaje de programación o aplicación web hospedada en cualquier lugar.
  • Los webhooks y Azure Service Bus se pueden invocar desde un complemento o una actividad personalizada de flujo de trabajo.

Introducción

Existen tres partes para utilizar webhooks:

  • Crear o configurar un servicio para consumir solicitudes de webhook.
  • Registrar paso de webhook en el servicio de Dynamics 365 o
  • Llamar un webhook desde un complemento o actividad personalizada de flujo de trabajo.

Este tema empezará a explicar cómo registrar un webhook y cómo probar el registro mediante un sitio de registro de solicitud. Esta información ayudará a informarle acerca de los requisitos para crear y configurar un servicio diseñado para consumir las solicitudes de webhook que se explican en Crear o configurar un servicio para consumir solicitudes de webhook.

Registrar un webhook

Utilice la herramienta de registro de complementos para registrar un webhook. Para obtener la herramienta de registro de complementos, consulte Herramientas de desarrollo de Dataverse.

En la herramienta de registro de complementos puede seleccionar una nueva opción Registrar nuevo webhook.

Muestra la opción de menú para registrar un nuevo webhook. El método abreviado de teclado es Ctrl+W.

Al registrar un webhook debe proporcionar tres elementos de información:

Elemento Descripción
Nombre Un nombre único que describa el webhook.
URL de extremo La URL para publicar información de contexto de ejecución.
Autenticación Una de las tres opciones de autenticación. Para cualquier tipo de autenticación, debe proporcionar las claves que identificarán la solicitud como legítima.

Opciones de autenticación

La opción y los valores correctos de autenticación de registro de webhook que se van a utilizar dependen de lo que se espere del extremo. El propietario del extremo debe indicarle qué utilizar. Para usar webhooks con Dynamics 365, el punto de conexión debe permitir una de las tres opciones de autenticación que se describen a continuación:

Tipo Descripción
HttpHeader Incluye uno o varios pares de valores clave en el encabezado de la solicitud http.
Ejemplo:
Key1: Value1
Key2: Value2
WebhookKey Incluye una cadena de consulta mediante code como clave y un valor requerido para el punto de conexión. Al registrar el webhook mediante la herramienta de registro de complementos, escriba solo el valor.
Ejemplo:
?code=00000000-0000-0000-0000-000000000001
HttpQueryString Incluye uno o varios pares de valor clave como parámetros de cadena de consulta.
Ejemplo:
?Key1=Value1&Key2=Value2

Nota

La opción WebhookKey es útil con funciones de Azure porque se espera que la cadena de consulta de autenticación tenga un nombre de clave de code.

Cualquier solicitud para el extremo configurado debe fallar cuando no coinciden las opciones de autenticación pasadas en la solicitud. Esto es responsabilidad del extremo.

Consultar registros webhook

Los registros webhook se almacenan en la Entidad ServiceEndpoint y tienen un valor Contrato de 8.

Puede encontrar detalles sobre los webhooks registrados consultando la entidad ServiceEndpoint.

API web:

GET [organization URI]/api/data/v9.1/serviceendpoints?$filter=contract eq 8&$select= serviceendpointid,name,authtype,url

FetchXml:

<fetch>
  <entity name="serviceendpoint" >
    <attribute name="serviceendpointid" />
    <attribute name="name" />
    <attribute name="authtype" />
    <attribute name="url" />
    <filter>
      <condition attribute="contract" operator="eq" value="8" />
    </filter>
  </entity>
</fetch> 

La información detallada sobre el conjunto de valores de autenticación se encuentra en la propiedad AuthValue y no se puede recuperar.

Registrar un paso para un webhook

Registrar un paso para un webhook es similar a registrar un paso para un complemento. La diferencia principal es que no se puede especificar ninguna información de configuración.

Al igual que un complemento, especifique el mensaje y la información sobre las entidades cuando corresponda. También puede especificar en qué lugar de la canalización del evento se ejecutará el webhook, el modo de ejecución y si se eliminará algún AsyncOperation cuando la operación tenga éxito.

Diálogo de registro de complemento para registrar un nuevo paso de webhook.

La información sobre la Nombre del paso y la Descripción se rellenará automáticamente en función de las opciones que elija, pero puede cambiarlas. Si no establece algunos Atributos de filtro para un mensaje que los admita, se le pedirá que lo haga como las prácticas recomendadas de rendimiento.

El modo de ejecución y depuración del registro de su webhook

Su elección al registrar el webhook cambia la experiencia que tendrá al depurar si las cosas no funcionan.

Modo asincrónico

Cuando utilice un modo de ejecución asincrónica, se creará un trabajo de operación asincrónica para capturar el éxito o fracaso de la operación. Si elimina la operación asincrónica cuando tiene éxito ahorrará espacio en la base de datos.

Cualquier error que se produzca se registrará en los trabajos del sistema. En la aplicación web puede ir a Configuración > Sistema > Trabajos del sistema para revisar el estado de cualquier webhoook. Habrá un valor Razón para el estado de Erróneo. Abra la entidad de trabajo del sistema erróneo para encontrar detalles que describan la razón por la que falló el trabajo.

Modo sincrónico

Cuando decida usar un modo de ejecución sincrónica cualquier error se notificará al usuario de la aplicación con un diálogo de error Extremo no disponible que informa al usuario de que el extermo del servicio webhook puede estar configurado incorrectamente o no está disponible. El diálogo le permitirá descargar un archivo de registro para obtener los detalles de cualquier error.

Nota

Debe usar el modo sincrónico cuando sea importante que la operación desencadenada por el webhook se produzca de inmediato o si desea que toda la transacción falle salvo que el servicio reciba la carga de webhook. Un registro simple de paso de webhook proporciona opciones limitadas para administrar errores, pero también puede llamar webhooks mediante actividades de flujo de trabajo de complementos si necesita más control. Más información: Llamar un webhook de la actividad de un flujo de trabajo o del complemento.

Posibles causas de error

Los webhooks son relativamente simples. El servicio enviará la solicitud y evaluará la respuesta. El sistema no puede analizar los datos que se devuelve con el cuerpo de la respuesta, solo buscará en el valor StatusCode de respuesta.

El tiempo de espera es de 60 segundos. En general, esto fallará si no se devuelve ninguna respuesta antes del tiempo de espera o si el valor StatusCode de respuesta no se encuentra en el intervalo 2xx para indicar éxito. La excepción se produce cuando el error devuelto se encuentra en la tabla siguiente:

StatusCode Descripción
502 Puerta de enlace incorrecta
503 Servicio no disponible
504 Tiempo de espera de puerta de enlace

Estos errores indican un problema de red que se puede resolver con otro intento. El servicio webhook hará un intento más solo cuando se devuelvan estos códigos de error.

Consulte Consultar trabajos asincrónicos que dan error para un paso determinado para obtener información sobre cómo recuperar datos sobre trabajos asincrónicos que dan error.

Pasos de consulta registrados para un webhook

Los datos para webhooks registrados se encuentran en la Entidad SdkMessageProcessingStep.

Puede consultar los pasos registrados para un webhook específico cuando conozca el serviceendpointid para el webhook. Consulte Consultar registros webhook para obtener el identificador de un webhook registrado en una consulta.

Api web:

Puede usar esta consulta de API web en la que <id> es el ServiceEndpointId del webhook:

GET [organization URI]/api/data/v9.1/serviceendpoints(@id)/serviceendpoint_sdkmessageprocessingstep?$select=sdkmessageprocessingstepid,name,description,asyncautodelete,filteringattributes,mode,stage?@id=<id>

Para obtener más información sobre el paso registrado, puede usar esta consulta de API web en la que <stepid> es el SdkMessageProcessingStepId para el paso:

GET [organization URI]/api/data/v9.1/sdkmessageprocessingsteps(@id)?$select=name,description,filteringattributes,asyncautodelete,mode,stage&$expand=plugintypeid($select=friendlyname),eventhandler_serviceendpoint($select=name),sdkmessagefilterid($select=primaryobjecttypecode),sdkmessageid($select=name)?@id=<stepid>

FetchXML:

Puede usar este FetchXML para obtener la misma información en una consulta en la que <serviceendpointid> es el id. del webhook:

<fetch>
  <entity name="sdkmessageprocessingstep" >
    <attribute name="name" />
    <attribute name="filteringattributes" />
    <attribute name="stage" />
    <attribute name="asyncautodeletename" />
    <attribute name="description" />
    <attribute name="mode" />
    <link-entity name="serviceendpoint" from="serviceendpointid" to="eventhandler" link-type="inner" alias="endpnt" >
      <attribute name="name" />
      <filter>
        <condition attribute="serviceendpointid" operator="eq" value="<serviceendpointid>" />
      </filter>
    </link-entity>
    <link-entity name="sdkmessagefilter" from="sdkmessagefilterid" to="sdkmessagefilterid" link-type="inner" alias="fltr" >
      <attribute name="primaryobjecttypecode" />
    </link-entity>
    <link-entity name="sdkmessage" from="sdkmessageid" to="sdkmessageid" link-type="inner" alias="msg" >
      <attribute name="name" />
    </link-entity>
  </entity>
</fetch>

Consultar trabajos asincrónicos que dan error para un paso determinado

Cuando conozca el sdkmessageprocessingstepid de un paso determinado, puede consultar la Entidad AsynchronousOperations para cualquier error. Puede usar el valor OwningExtensionId para filtrar los resultados para un paso registrado específico. Los siguientes ejemplos utilizan <stepid> para el sdkmessageprocessingstepid del paso.

API web:

GET [organization URI]/api/data/v9.1/asyncoperations?$orderby=completedon desc&$filter=statuscode eq 31 and _owningextensionid_value eq @stepid&$select=name,friendlymessage,errorcode,message,completedon?@stepid=<stepid>

FetchXML:

<fetch>
  <entity name="asyncoperation" >
    <attribute name="name" />
        <attribute name="friendlymessage" />
    <attribute name="errorcode" />
    <attribute name="message" />
    <attribute name="completedon" />     
    <filter>
      <condition attribute="owningextensionid" operator="eq" value="<stepid>" />
    </filter>
    <order attribute="completedon" descending="true" />
  </entity>
</fetch>

Probar el registro con un sitio de registro de solicitud

Antes de pasar a crear o configurar un servicio para consumir webhooks, debe probar el tipo de datos que recibirá el servicio para saber qué tipo de datos tendrá que procesar. Para ello, puede usar uno de distintos sitios de registro de solicitud. Para este ejemplo, vamos a usar RequestBin para configurar un destino para las solicitudes de webhook. Lleve a cabo los pasos siguientes:

  1. Vaya a https://requestbin.com/ y haga clic en Crear solicitud de ubicación.

  2. La página siguiente proporciona una dirección URL de ubicación como: https://<random string>.x.pipestream.net. Copie esta URL.

  3. Utilice la herramienta de registro de complementos para registrar un nueva webhook tal como se describe en Registrar un webhook. Use la URL que copió en el paso 2 como la URL de extremo. Defina un nombre y cualquier propiedad de autenticación que desee. La ubicación de solicitud no evaluará estos valores de la forma que un sitio real procesaría los datos, pero puede ver cómo se transfirieron.

  4. Utilice la herramienta de registro de complementos para registrar un paso mediante el webhook que creó en el paso 3 tal como se describe en Registrar un paso para un webhook. Asegúrese de usar un evento que puede realizar fácilmente editando los datos en la aplicación de Dynamics 365, como la actualización de una entidad de contacto.

  5. Utilice la aplicación de Dynamics 365 para realizar la operación para desencadenar el evento.

  6. Una vez que desencadene el evento, vuelva a la página RequestBin del paso 2. Debe detectar una página similar a la siguiente:

    Un ejemplo de la solicitud registrada en el sitio web de la ubicación de solicitud.

Nota

Los resultados que se muestran en este sitio no representan necesariamente la capitalización de los valores enviados. Los encabezados HTTP no distinguen entre mayúsculas y minúsculas y el sitio RequestBin parece aplicar algunas reglas de formato para facilitar la lectura de los valores. Sin embargo, los valores enviados por Dynamics 365 son todos en minúsculas, independientemente de lo que se muestra aquí. Más información: Datos del encabezado

Este ejemplo muestra los datos que se transmiten a la solicitud de webhook para la actualización de un contacto en el que el webhook se registra para transmitir los pares de valor clave de autenticación HttpHeader:

Key Value
X-Test1 test1
X-Test2 test2

Encontrará los datos de contexto de ejecución como una cadena JSON en la sección RAW BODY en la parte inferior de la entrada. Estos son los datos que el servicio web que procesa la solicitud de webhook necesitará evaluar. Más información: Cuerpo de la solicitud

Crear o configurar un servicio para consumir solicitudes de webhook

Los webhooks son simplemente un patrón que se puede aplicar mediante una gran variedad de tecnologías. No es necesario utilizar marcos, plataformas o lenguajes de programación. Utilice las capacidades y conocimiento que tiene para proporcionar la solución apropiada. Las Funciones de Azure proporcionan una forma excelente de ofrecer una solución mediante webhooks, pero no es un requisito. Esta sección no proporcionará instrucciones para una solución específica, sino que describirá los datos que se transmitirán a su servicio y permitirá añadir valor a este.

Como se muestra en Probar el registro con un sitio de registro de solicitud, puede registrar un paso de webhook de prueba y usar el sitio de registro de solicitud para capturar los tipos específicos de datos que pueda procesar su aplicación.

Datos que se transmiten al servicio

Existen tres tipos de datos en la solicitud: cadena de consulta, datos de encabezado y cuerpo de la solicitud.

Cadena de consulta

El único tipo de datos que se transmitirá como una cadena de consulta pueden ser los valores de autenticación transmitidos si el webhook está configurado para usar las opciones WebhookKey o HttpQueryString como se describe en las Opciones de autenticación.

Datos del encabezado

Si selecciona la opción de autenticación HttpHeader, deberá usar los pares de clave/valor que requiera su servicio.

En la siguiente tabla aparecen otros datos que es posible que encuentre transmitidos a su servicio:

Key Descripción del valor
x-request-id Un identificador único para la solicitud
x-ms-dynamics-organization El nombre del inquilino que envía la solicitud
x-ms-dynamics-entity-name El nombre lógico de la entidad transmitida a los datos de contexto de ejecución.
x-ms-dynamics-request-name El nombre del evento para el que se registró el paso de webhook.
x-ms-correlation-request-id Identificador único para realizar un seguimiento de cualquier tipo de extensión. La plataforma utiliza esta propiedad para la prevención de bucle infinito. En la mayoría de casos, esta propiedad se puede omitir. Este valor se puede utilizar cuando se trabaja con el soporte técnico, ya que se puede usar para consultar telemetría y comprender lo que ocurrió durante toda la operación.
x-ms-dynamics-msg-size-exceeded Se envía solo cuando el tamaño de la carga HTTP supera los 256 KB.

Cuerpo de la solicitud

El cuerpo contendrá una cadena que representa el valor JSON de una instancia de la clase RemoteExecutionContext. Estos son los mismos datos que se transmiten a las integraciones de bus del servicio de Azure.

El servicio que cree debe analizar estos datos para extraer los elementos relevantes de información para que su servicio proporcione su función. Cómo decidir analizar estos datos depende de la tecnología que utilice y de sus preferencias.

Importante

Debido a determinadas optimizaciones del bus de servicio, no se recomienda que los desarrolladores de .NET deserialicen el cuerpo de solicitud del mensaje con formato JSON a un objeto RemoteExecutionContext. En su lugar, use JObject para analizar el cuerpo del mensaje.

El siguiente es un ejemplo de los datos JSON serializados transmitidos para un paso registrado con las propiedades siguientes:

Propiedad Descripción
Mensaje Actualizar
Entidad principal contacto
Entidad secundaria ninguna
Atributos de filtro firstname,lastname
Ejecutar en contexto de usuario Usuario que llama
Pedido de ejecución 1
Fase de canalización de eventos de ejecución PostOperation
Modo de ejecución Asincrónico

En este ejemplo, el nombre de pila del contacto cambió de 'Jim' a 'James'.

{
    "BusinessUnitId": "e2b9dd85-e89e-e711-8122-000d3aa2331c",
    "CorrelationId": "aaaa0000-bb11-2222-33cc-444444dddddd",
    "Depth": 1,
    "InitiatingUserId": "11bb11bb-cc22-dd33-ee44-55ff55ff55ff",
    "InputParameters": [{
        "key": "Target",
        "value": {
            "__type": "Entity:http:\/\/schemas.microsoft.com\/xrm\/2011\/Contracts",
            "Attributes": [{
                "key": "firstname",
                "value": "James"
            }, {
                "key": "contactid",
                "value": "6d81597f-0f9f-e711-8122-000d3aa2331c"
            }, {
                "key": "fullname",
                "value": "James Glynn (sample)"
            }, {
                "key": "yomifullname",
                "value": "James Glynn (sample)"
            }, {
                "key": "modifiedon",
                "value": "\/Date(1506384247000)\/"
            }, {
                "key": "modifiedby",
                "value": {
                    "__type": "EntityReference:http:\/\/schemas.microsoft.com\/xrm\/2011\/Contracts",
                    "Id": "11bb11bb-cc22-dd33-ee44-55ff55ff55ff",
                    "KeyAttributes": [],
                    "LogicalName": "systemuser",
                    "Name": null,
                    "RowVersion": null
                }
            }, {
                "key": "modifiedonbehalfby",
                "value": null
            }],
            "EntityState": null,
            "FormattedValues": [],
            "Id": "6d81597f-0f9f-e711-8122-000d3aa2331c",
            "KeyAttributes": [],
            "LogicalName": "contact",
            "RelatedEntities": [],
            "RowVersion": null
        }
    }],
    "IsExecutingOffline": false,
    "IsInTransaction": false,
    "IsOfflinePlayback": false,
    "IsolationMode": 1,
    "MessageName": "Update",
    "Mode": 1,
    "OperationCreatedOn": "\/Date(1506409448000-0700)\/",
    "OperationId": "4af10637-4ea2-e711-8122-000d3aa2331c",
    "OrganizationId": "00aa00aa-bb11-cc22-dd33-44ee44ee44ee",
    "OrganizationName": "OrgName",
    "OutputParameters": [],
    "OwningExtension": {
        "Id": "75417616-4ea2-e711-8122-000d3aa2331c",
        "KeyAttributes": [],
        "LogicalName": "sdkmessageprocessingstep",
        "Name": null,
        "RowVersion": null
    },
    "ParentContext": {
        "BusinessUnitId": "e2b9dd85-e89e-e711-8122-000d3aa2331c",
        "CorrelationId": "aaaa0000-bb11-2222-33cc-444444dddddd",
        "Depth": 1,
        "InitiatingUserId": "11bb11bb-cc22-dd33-ee44-55ff55ff55ff",
        "InputParameters": [{
            "key": "Target",
            "value": {
                "__type": "Entity:http:\/\/schemas.microsoft.com\/xrm\/2011\/Contracts",
                "Attributes": [{
                    "key": "firstname",
                    "value": "James"
                }, {
                    "key": "contactid",
                    "value": "6d81597f-0f9f-e711-8122-000d3aa2331c"
                }],
                "EntityState": null,
                "FormattedValues": [],
                "Id": "6d81597f-0f9f-e711-8122-000d3aa2331c",
                "KeyAttributes": [],
                "LogicalName": "contact",
                "RelatedEntities": [],
                "RowVersion": null
            }
        }, {
            "key": "SuppressDuplicateDetection",
            "value": false
        }],
        "IsExecutingOffline": false,
        "IsInTransaction": false,
        "IsOfflinePlayback": false,
        "IsolationMode": 1,
        "MessageName": "Update",
        "Mode": 1,
        "OperationCreatedOn": "\/Date(1506409448000-0700)\/",
        "OperationId": "4af10637-4ea2-e711-8122-000d3aa2331c",
        "OrganizationId": "00aa00aa-bb11-cc22-dd33-44ee44ee44ee",
        "OrganizationName": "OneFarm",
        "OutputParameters": [],
        "OwningExtension": {
            "Id": "75417616-4ea2-e711-8122-000d3aa2331c",
            "KeyAttributes": [],
            "LogicalName": "sdkmessageprocessingstep",
            "Name": null,
            "RowVersion": null
        },
        "ParentContext": null,
        "PostEntityImages": [],
        "PreEntityImages": [],
        "PrimaryEntityId": "6d81597f-0f9f-e711-8122-000d3aa2331c",
        "PrimaryEntityName": "contact",
        "RequestId": null,
        "SecondaryEntityName": "none",
        "SharedVariables": [{
            "key": "ChangedEntityTypes",
            "value": [{
                "__type": "KeyValuePairOfstringstring:#System.Collections.Generic",
                "key": "feedback",
                "value": "Update"
            }, {
                "__type": "KeyValuePairOfstringstring:#System.Collections.Generic",
                "key": "contract",
                "value": "Update"
            }, {
                "__type": "KeyValuePairOfstringstring:#System.Collections.Generic",
                "key": "salesorder",
                "value": "Update"
            }, {
                "__type": "KeyValuePairOfstringstring:#System.Collections.Generic",
                "key": "connection",
                "value": "Update"
            }, {
                "__type": "KeyValuePairOfstringstring:#System.Collections.Generic",
                "key": "socialactivity",
                "value": "Update"
            }, {
                "__type": "KeyValuePairOfstringstring:#System.Collections.Generic",
                "key": "postfollow",
                "value": "Update"
            }, {
                "__type": "KeyValuePairOfstringstring:#System.Collections.Generic",
                "key": "incident",
                "value": "Update"
            }, {
                "__type": "KeyValuePairOfstringstring:#System.Collections.Generic",
                "key": "invoice",
                "value": "Update"
            }, {
                "__type": "KeyValuePairOfstringstring:#System.Collections.Generic",
                "key": "entitlement",
                "value": "Update"
            }, {
                "__type": "KeyValuePairOfstringstring:#System.Collections.Generic",
                "key": "lead",
                "value": "Update"
            }, {
                "__type": "KeyValuePairOfstringstring:#System.Collections.Generic",
                "key": "opportunity",
                "value": "Update"
            }, {
                "__type": "KeyValuePairOfstringstring:#System.Collections.Generic",
                "key": "quote",
                "value": "Update"
            }, {
                "__type": "KeyValuePairOfstringstring:#System.Collections.Generic",
                "key": "socialprofile",
                "value": "Update"
            }, {
                "__type": "KeyValuePairOfstringstring:#System.Collections.Generic",
                "key": "contact",
                "value": "Update"
            }]
        }],
        "Stage": 30,
        "UserId": "11bb11bb-cc22-dd33-ee44-55ff55ff55ff"
    },
    "PostEntityImages": [{
        "key": "AsynchronousStepPrimaryName",
        "value": {
            "Attributes": [{
                "key": "fullname",
                "value": "James Glynn (sample)"
            }, {
                "key": "contactid",
                "value": "6d81597f-0f9f-e711-8122-000d3aa2331c"
            }],
            "EntityState": null,
            "FormattedValues": [],
            "Id": "6d81597f-0f9f-e711-8122-000d3aa2331c",
            "KeyAttributes": [],
            "LogicalName": "contact",
            "RelatedEntities": [],
            "RowVersion": null
        }
    }],
    "PreEntityImages": [],
    "PrimaryEntityId": "6d81597f-0f9f-e711-8122-000d3aa2331c",
    "PrimaryEntityName": "contact",
    "RequestId": null,
    "SecondaryEntityName": "none",
    "SharedVariables": [],
    "Stage": 40,
    "UserId": "11bb11bb-cc22-dd33-ee44-55ff55ff55ff"
}

Importante

Cuando el tamaño de toda la carga HTTP supera 256 KB, se incluirá el encabezado x-ms-dynamics-msg-size-exceeded y se eliminarán las siguientes propiedades RemoteExecutionContext:

Algunas operaciones no incluyen estas propiedades.

Llamar un webhook de la actividad de un flujo de trabajo o del complemento

Puesto que un webhook es un tipo de extremo de servicio, también puede llamarlo sin registrar un paso con una actividad de flujo de trabajo o del complemento del mismo modo que puede para un extremo de Azure Service Bus. Es necesario proporcionar el ServiceEndpointId para la interfaz IServiceEndpointNotificationService. Consulte los siguientes ejemplos de Azure Service Bus para obtener más información:

Vea también

Ampliar Customer Engagement en el servidor
Escriba complementos para ampliar los procesos de negocio
Automatizar los procesos de negocio en Customer Engagement (on-premises)
Servicio asincrónico en Dynamics 365 Customer Engagement (on-premises)
Extensiones de Azure para Dynamics 365 Customer Engagement (on-premises)
Ejemplo: complemento personalizado con Azure
Ejemplo: actividad personalizada de flujo de trabajo basada en Azure
Funciones de Azure
Entidad ServiceEndpoint
Entidad SdkMessageProcessingStep
Entidad AsynchronousOperations
RemoteExecutionContext
IServiceEndpointNotificationService