Compartir a través de


Operaciones en segundo plano (versión preliminar)

[Este artículo es documentación preliminar y está sujeto a modificaciones].

Use operaciones en segundo plano para enviar solicitudes que Dataverse procesa de forma asincrónica. Las operaciones en segundo plano son útiles cuando no desea mantener una conexión mientras se ejecuta una solicitud.

Cuando se completa una operación en segundo plano, puede recibir una notificación de dos maneras:

  • Incluya una URL de callback con la solicitud.
  • Suscríbase al evento.

Puede recuperar el resultado de una operación en segundo plano de dos maneras:

  • Sondee la tabla de operaciones en segundo plano.
  • Sondee el recurso del monitor de estado.

Para ejecutar una solicitud en segundo plano, defina la operación como una API personalizada. Para más información, consulte Creación y uso de API personalizadas y recuperación de datos sobre las API personalizadas.

Las API personalizadas usan complementos para realizar operaciones de datos. Al igual que todos los complementos de Dataverse, estos complementos tienen un tiempo de espera de ejecución de dos minutos. El envío de la solicitud de forma asincrónica no proporciona más tiempo de ejecución.

Privilegios requeridos

Para realizar una operación en segundo plano, el usuario iniciador debe tener acceso de lectura y escritura a la tabla. Asigne los privilegios y para conceder este acceso.

  • SDK:
  • API web: Acción AddPrivilegesRole

Obtenga información sobre cómo editar un rol de seguridad.

Solicitud de procesamiento asincrónico

Puede ejecutar solicitudes asincrónicas en segundo plano mediante el SDK para .NET o la API web de Dataverse.

En los ejemplos de este artículo se usa una API personalizada denominada . Para obtener más información sobre esta API personalizada, vea Sample: ExportDataUsingFetchXmlToAnnotation custom API.

Utilice el mensaje.

El SDK no tiene clases de solicitud y respuesta. Hasta que se agreguen estas clases, use las clases base OrganizationRequest y OrganizationResponse tal como se describe en Use mensajes con el SDK para .NET.

En la tabla siguiente se describen los parámetros de entrada del mensaje.

Nombre Tipo Description
Request OrganizationRequest (Obligatorio) Contiene la solicitud que desea procesar de forma asincrónica. El mensaje de Dataverse para la solicitud debe implementarse como una API personalizada.
CallbackUri cuerda / cadena (Opcional) Dataverse envía una solicitud HTTP POST a esta dirección URL cuando se completa la operación.

En la tabla siguiente se describen los parámetros de salida del mensaje.

Nombre Tipo Description
BackgroundOperationId GUID Identifica la fila de la tabla de operaciones en segundo plano que puede usar para supervisar o cancelar el procesamiento de la solicitud.
Location cuerda / cadena Identifica la dirección URL del recurso del monitor de estado que puede usar para recuperar el estado de la solicitud o cancelarla.

El siguiente método estático usa con la API personalizada.

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"]}");
}

Salida:

BackgroundOperationId: <backgroundoperationid value>
Location: [Organization URI]/api/backgroundoperation/<backgroundoperationid value>

Obtenga más información sobre la interfaz IOrganizationService y cómo usar mensajes con el SDK para .NET.

Administración de operaciones en segundo plano

Al enviar una solicitud que se va a procesar en segundo plano, la respuesta incluye dos valores que representan métodos diferentes que puede usar para supervisar o cancelar operaciones en segundo plano.

  • Use el identificador de una fila de la tabla para recuperar o actualizar datos de la tabla:

    • Sondear la tabla de operaciones en segundo plano
    • Cancelar una operación en segundo plano actualizando las operaciones en segundo plano
  • Utiliza la URL , que representa el recurso del monitor de estado, para sondear y cancelar las operaciones en segundo plano.

    • Sondee el recurso del monitor de estado.
    • Envíe una solicitud DELETE al recurso del monitor de estado.

    Importante

    El recurso de monitor de estado no es el recurso de EntityType de la API web.

    URL Example
    Recurso de supervisión de estado [Organization URI]/api/backgroundoperation/<backgroundoperationid value>
    Recurso TipoDeEntidad [Organization URI]/api/data/v9.2/backgroundoperations(<backgroundoperationid value>)

    El recurso de supervisión de estado no forma parte de la API web de Dataverse. Observe que la dirección URL no contiene . El recurso del monitor de estado solo admite operaciones GET y DELETE y no tiene los mismos comportamientos que el recurso EntityType de la API web.

Consultar la tabla de operaciones en segundo plano o el recurso de supervisión de estado para comprobar las solicitudes se conoce normalmente como sondeo de estado. Evite un sondeo excesivo porque puede afectar negativamente al rendimiento. Si es necesario, sondee en un intervalo de un minuto o más.

Tabla de operaciones en segundo plano

La tabla de operaciones en segundo plano contiene información sobre las solicitudes para procesar de forma asincrónica. Esta tabla tiene el nombre lógico y el nombre del conjunto de entidades . Obtenga información sobre backgroundoperation EntityType.

En la tabla siguiente se describen las columnas que puede usar para administrar el estado de las operaciones en segundo plano.

Nombre
Nombre del esquema
Nombre lógico
Tipo Description
Operación en segundo plano
BackgroundOperationId
backgroundoperationid
Uniqueidentifier La clave principal
Estado
StateCode
backgroundoperationstatecode
Lista de selección Estado de la operación en segundo plano

Options:
- Valor: , Etiqueta: Listo
- Valor: , Etiqueta: Bloqueado
- Valor: , Etiqueta: Completado
Razón para el estado
StatusCode
backgroundoperationstatuscode
Lista de selección Estado de la operación en segundo plano

Options:
- Valor: , etiqueta: esperando recursos (estado:listo)
- Valor: , etiqueta: en curso (estado:bloqueado)
- Valor: , Etiqueta: Cancelación (Estado:Bloqueado)
- Valor: , Etiqueta: Exitoso (Estado:Completado)
- Valor: , Etiqueta: Error (Estado:Completado)
- Valor: , Etiqueta: Cancelada (Estado:Completado)
Nombre
Name
name
String de la API personalizada que se usa para la operación en segundo plano
DisplayName (Nombre para mostrar)
DisplayName
displayname
String de la API personalizada que se usa para la operación en segundo plano
Parámetros de entrada
InputParameters
inputparameters
Memorándum Parámetros de entrada proporcionados para iniciar la operación en segundo plano

Esta cadena es una matriz serializada json de y .
Parámetros de salida
OutputParameters
outputparameters
Memorándum La respuesta de la operación en segundo plano

Esta cadena es una matriz serializada json de y .
Hora de comienzo
StartTime
starttime
DateTime Cuando se inició la ejecución de la operación en segundo plano
Hora de finalización
EndTime
endtime
DateTime Cuando la operación en segundo plano finaliza la ejecución
Recuento de reintentos
RetryCount
retrycount
Integer Número de veces que se reintentó la operación en segundo plano.
Código de error
ErrorCode
errorcode
Integer Código de error si se produce un error en la operación en segundo plano

Si el error procede de Dataverse, tiene un valor entero que corresponde a uno de los códigos enumerados en códigos de error del servicio web. Si el error no procede de Dataverse, el valor se establece en cero.
Mensaje de error
ErrorMessage
errormessage
Memorándum Mensaje de error si se produce un error en la operación en segundo plano
Ejecutar como
RunAs
runas
String El del utilizado para ejecutar la operación en segundo plano
Creadas el
CreatedOn
createdon
DateTime Cuando se creó el registro
Período de vida
TTLInSeconds
ttlinseconds
Integer Tiempo de vida en segundos, después del cual el registro se elimina automáticamente; el valor predeterminado es 90 días.

Sondee la tabla de operaciones en segundo plano

Asegúrese de incluir estas columnas en la consulta:

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

La forma de sondear la tabla depende de si usa el SDK o la API web.

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}'");
    }
}

Salida pendiente:

Name: sample_ExportDataUsingFetchXmlToAnnotation
State Code: Locked
Status Code:  In Progress
Output Parameters:  
Error Code:  
Error Message:  

Salida completa:

Name: sample_ExportDataUsingFetchXmlToAnnotation
State Code: Completed
Status Code:  Succeeded
Output Parameters:
        AnnotationId: {value}
Error Code:  
Error Message:  

Salida de error:

Name: sample_ExportDataUsingFetchXmlToAnnotation
State Code: Completed
Status Code:  Failed
Output Parameters: 
Error Code:  -2147187707
Error Message:  Access is denied.

Si la plataforma produce el error, tiene un valor entero que corresponde a uno de los códigos enumerados en los códigos de error del servicio web. Si la plataforma no genera el error, establezca su valor en cero.

No se encontró el identificador:

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"}]}}

Sondeo del recurso de supervisión de estado

Puede sondear el recurso de supervisión de estado mediante una solicitud GET. Esta solicitud devuelve el estado de la operación en segundo plano. Si se completa la operación, proporciona la salida de la API personalizada. Si se produce un error durante la ejecución, recibirá un mensaje de error y un código.

Envíe una solicitud a la URL del recurso del monitor de estado que la solicitud original devuelve en el encabezado de respuesta .

Solicitud:

GET [Organization URI]/api/backgroundoperation/{backgroundoperationid}
Content-Type: application/json  

Respuesta:

HTTP/1.1 200 OK
Content-Type: application/json

{
  backgroundOperationErrorCode: {INT},
  backgroundOperationErrorMessage: {string},
  backgroundOperationStateCode: {INT},
  backgroundOperationStatusCode: {INT},
  outputParam1: {value},
  outputParam2: {value},
  outputParam3: {value},
}

La respuesta incluye los valores y solo cuando se produce un error. Incluye parámetros de salida solo cuando la operación se completa correctamente.

El recurso del monitor de estado no proporciona etiquetas.

Recepción de la notificación del resultado

Para recibir una notificación cuando finalice una operación en segundo plano, puede incluir una URL de devolución de llamada con su solicitud o suscribirse al evento .

Solicitar una llamada de vuelta

Puede especificar una dirección URL en la solicitud para recibir una devolución de llamada cuando finalice la operación. Dataverse usa esta dirección URL para enviar una solicitud POST con la carga siguiente:

{
    "location": "< status monitor resource URL >",
    "backgroundOperationId": "{GUID}",
    "backgroundOperationStateCode": {INT},
    "backgroundOperationStatusCode": {INT},
    "backgroundOperationErrorCode": {INT},
    "backgroundOperationErrorMessage": {string},
}

y solo se incluyen cuando se produce un error.

La carga de devolución de llamada no incluye ningún parámetro de salida. El sitio que recibe la devolución de llamada debe enviar una solicitud GET autenticada utilizando la URL del recurso del monitor de estado para obtener los resultados.

Si la dirección URL requiere autenticación, debe ser una dirección URL de firma de acceso compartido (SAS) autoadministrada. No se pueden incluir más encabezados para incluir claves de API o tokens para la autenticación.

Para probar la dirección URL de devolución de llamada, considere la posibilidad de usar un sitio como webhook.site.

La forma en que solicita una devolución de llamada depende de si está utilizando el SDK o la API web. En los ejemplos siguientes se envía una solicitud mediante un webhook para webhook.site para realizar pruebas.

Mediante el SDK, establezca el parámetro en la dirección URL para enviar la solicitud.

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"]}");
}

Suscríbase al evento OnBackgroundOperationComplete

Puede obtener una notificación cuando finalice una operación en segundo plano registrando un paso en el mensaje. Este mensaje es una API personalizada que solo admite registros de pasos asincrónicos. Es un ejemplo del tipo de mensajes creados mediante una API personalizada para representar eventos empresariales.

Como sugiere el nombre, el evento OnBackgroundOperationComplete se produce cada vez que se completa una operación en segundo plano. Al registrar un paso asincrónico en este evento, puede realizar cualquier tipo de lógica que desee en un complemento o reenviar los datos a Azure servicios o un webhook. Para obtener más información, consulte:

En las tablas siguientes se describen los parámetros de entrada y salida del mensaje.

Parámetros de entrada:

Nombre Tipo Description
PayloadType Integer Tipo de respuesta enviada al URI de devolución de llamada cuando finaliza la operación en segundo plano. Siempre cero para las operaciones en segundo plano.

Este campo es interno y no debe actualizarse.
LocationUrl String Dirección URL de ubicación
BackgroundOperationId GUID Identificador de la operación en segundo plano

Parámetros de salida:

Nombre Tipo Description
OperationName String Nombre de la operación
BackgroundOperationStateCode Integer Código de estado de la operación en segundo plano
BackgroundOperationStatusCode Integer Código de estado de la operación en segundo plano

Configure el mensaje como se muestra en las instrucciones para registrar un complemento. Establezca el nombre del mensaje como . Establezca Eliminación automática en para que el registro de trabajo del sistema (AsyncOperation) se quite automáticamente.

Cancelar las operaciones en segundo plano

Puede cancelar una operación en segundo plano que inició si no comenzó.

  • Si la operación no se inició, Dataverse no la ejecuta.
  • Si se inició la operación, Dataverse no la detiene.
  • Si se produce un error durante la ejecución de una operación en segundo plano que canceló, Dataverse no lo reintenta.
  • Si la operación ya se ha completado, obtendrá el siguiente error:

Puede cancelar una operación en segundo plano de dos maneras:

  • Cancelar una operación en segundo plano actualizando las operaciones en segundo plano
  • Envío de una solicitud DELETE al recurso de supervisión de estado

Cancelar una operación en segundo plano actualizando las operaciones en segundo plano

Actualice la fila de la tabla para establecer el en (Bloqueado) y el en (Cancelando).

La forma de actualizar la tabla depende de si usa el SDK o la API web.

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);
}

Envíe una solicitud DELETE al recurso del monitor de estado

También puede cancelar una operación en segundo plano enviando una solicitud DELETE al recurso de supervisión de estado.

Solicitud:

DELETE [Organization URI]/api/backgroundoperation/{backgroundoperationid}

Respuesta:

HTTP/1.1 200 Ok

{
    backgroundOperationStateCode: 2,
    backgroundOperationStatusCode: 22
}

Reintentos

Si se produce un error durante la ejecución de la solicitud, el sistema reintenta hasta tres veces. Estos reintentos utilizan una estrategia de retroceso exponencial.