Condividi tramite


Utilizzare ExecuteMultiple migliorare le prestazioni per il carico dei dati in blocco

 

Data di pubblicazione: novembre 2016

Si applica a: Dynamics CRM 2015

È possibile utilizzare il messaggio ExecuteMultipleRequest per supportare scenari con maggiore passaggio di messaggi in Aggiornamento di Microsoft Dynamics CRM 2015 e Microsoft Dynamics CRM Online 2015, soprattutto nel caso Microsoft Dynamics CRM Online dove la latenza internet può essere il maggior criterio di limitazione.ExecuteMultipleRequest accetta una raccolta dati di input di messaggio Requests, esegue le richieste di messaggio nell'ordine in cui appaiono nella raccolta dei dati di input e facoltativamente restituisce una raccolta Responses che contiene la risposta o gli errori di ogni messaggio che si sono verificati. Ogni richiesta del messaggio nella raccolta di input viene elaborata in una transazione di database distinta.ExecuteMultipleRequest è eseguito tramite il metodo IOrganizationService.Execute.

In generale, ExecuteMultipleRequest si comporta in genere come se si eseguisse ogni richiesta di messaggio nella raccolta di richieste di input separatamente, ad eccezione delle prestazioni migliori. L'utilizzo del parametro CallerId del proxy del servizio è valido e verrà applicato all'esecuzione di ogni messaggio nella raccolta di richieste di input. Plug-in e attività del flusso di lavoro vengono eseguiti come si prevede per ogni messaggio elaborato.

Codice personalizzato nel modulo dei plug-in e attività personalizzate del flusso di lavoro possono eseguire anche ExecuteMultipleRequest. Tuttavia, sono presenti alcuni punti chiave da tenere presente. Un'eccezione generata da un plug-in registrato sincrono viene restituita in risposta al parametro Fault dell'elemento della raccolta delle risposte. Se un plug-in viene eseguito in una transazione di database ed esegue ExecuteMultipleRequest e se viene avviato un rollback della transazione, il rollback include tutte le modifiche apportate ai dati derivate dalle richieste eseguite da ExecuteMultipleRequest.

In questo argomento

Esempio

Specificare opzioni di esecuzione di runtime

Limitazioni di runtime

Gestire un errore relativo alle dimensioni batch

Esempio

Il codice seguente di esempio illustra un singolo oggetto ExecuteMultipleRequest che esegue più operazioni di creazione. Le opzioni di runtime denominate Impostazioni vengono usate per controllare l'elaborazione delle richieste e i risultati restituiti. Tali opzioni di runtime vengono descritte nella sezione successiva.


// Get a reference to the organization service.
using (_serviceProxy = new OrganizationServiceProxy(serverConfig.OrganizationUri, serverConfig.HomeRealmUri,serverConfig.Credentials, serverConfig.DeviceCredentials))
{
    // Enable early-bound type support to add/update entity records required for this sample.
    _serviceProxy.EnableProxyTypes();

    #region Execute Multiple with Results
    // Create an ExecuteMultipleRequest object.
    requestWithResults = new ExecuteMultipleRequest()
    {
        // Assign settings that define execution behavior: continue on error, return responses. 
        Settings = new ExecuteMultipleSettings()
        {
            ContinueOnError = false,
            ReturnResponses = true
        },
        // Create an empty organization request collection.
        Requests = new OrganizationRequestCollection()
    };

    // Create several (local, in memory) entities in a collection. 
    EntityCollection input = GetCollectionOfEntitiesToCreate();

    // Add a CreateRequest for each entity to the request collection.
    foreach (var entity in input.Entities)
    {
        CreateRequest createRequest = new CreateRequest { Target = entity };
        requestWithResults.Requests.Add(createRequest);
    }

    // Execute all the requests in the request collection using a single web method call.
    ExecuteMultipleResponse responseWithResults =
        (ExecuteMultipleResponse)_serviceProxy.Execute(requestWithResults);

    // Display the results returned in the responses.
    foreach (var responseItem in responseWithResults.Responses)
    {
        // A valid response.
        if (responseItem.Response != null)
            DisplayResponse(requestWithResults.Requests[responseItem.RequestIndex], responseItem.Response);

        // An error has occurred.
        else if (responseItem.Fault != null)
            DisplayFault(requestWithResults.Requests[responseItem.RequestIndex], 
                responseItem.RequestIndex, responseItem.Fault);
    }

' Get a reference to the organization service.
_serviceProxy = ServerConnection.GetOrganizationProxy(serverConfig)

Using _serviceProxy
    ' Enable early-bound type support to add/update entity records required for this sample.
    _serviceProxy.EnableProxyTypes()

    '#Region "Execute Multiple with Results"
    ' Create an ExecuteMultipleRequest object.
    ' Assign settings that define execution behavior: continue on error, return responses.
    ' Create an empty organization request collection.
    requestWithResults = New ExecuteMultipleRequest() With
        {
            .Settings = New ExecuteMultipleSettings() With
                        {
                            .ContinueOnError = False,
                            .ReturnResponses = True
                        },
            .Requests = New OrganizationRequestCollection()
        }

    ' Create several (local, in memory) entities in a collection. 
    Dim input As EntityCollection = GetCollectionOfEntitiesToCreate()

    ' Add a CreateRequest for each entity to the request collection.
    For Each entity In input.Entities
        Dim createRequest_Renamed As CreateRequest = New CreateRequest With {.Target = entity}
        requestWithResults.Requests.Add(createRequest_Renamed)
    Next entity

    ' Execute all the requests in the request collection using a single web method call.
    Dim responseWithResults As ExecuteMultipleResponse =
        CType(_serviceProxy.Execute(requestWithResults), ExecuteMultipleResponse)

    ' Display the results returned in the responses.
    For Each responseItem In responseWithResults.Responses

        If responseItem.Response IsNot Nothing Then
            ' A valid response.
            DisplayResponse(requestWithResults.Requests(responseItem.RequestIndex),
                            responseItem.Response)

        ElseIf responseItem.Fault IsNot Nothing Then
            ' An error has occurred.
            DisplayFault(requestWithResults.Requests(responseItem.RequestIndex),
                         responseItem.RequestIndex, responseItem.Fault)
        End If
    Next responseItem

Per visualizzare l'esempio completo, vedere Esempio: Eseguire più richieste.

Specificare opzioni di esecuzione di runtime

Il parametro SettingsExecuteMultipleRequest è valido per tutte richieste nella raccolta di richieste che controllano il comportamento di esecuzione e i risultati restituiti. Tali opzioni vengono ora esaminate in dettaglio.

Membro di ExecuteMultipleSettings

Descrizione

ContinueOnError

Se il valore è true, continua a elaborare la richiesta successiva nella raccolta anche se un errore è stato restituito dall'elaborazione della richiesta corrente nella raccolta. Se il valore è false, non continua a elaborare la richiesta successiva.

ReturnResponses

Se il valore è true, restituisce risposte da ogni richiesta di messaggio elaborata. Se il valore è false, non restituisce risposte.

Se impostato su true e una richiesta non restituisce una risposta a causa della propria progettazione, ExecuteMultipleResponseItem per tale richiesta è impostato su null.

Tuttavia, quando il valore è false, la raccolta Responses non sarà vuota se vengono restituiti errori. Se vengono restituiti errori, sarà presente solo una risposta nella raccolta per ogni richiesta elaborata che ha restituito l'errore e Fault verrà impostato sull'errore effettivo che si è verificato.

Ad esempio, in una raccolta di richieste contenente sei richieste in cui la terza e la quinta richiesta restituiscono errori, nella tabella seguente viene indicato il contenuto della raccolta di Responses.

Impostazioni

Contenuti della raccolta di risposte

ContinueOnError=true, ReturnResponses=true

6 risposte: per 2 la proprietà Fault è impostata su un valore.

ContinueOnError=false, ReturnResponses=true

3 risposte: per 1 la proprietà Fault è impostata su un valore.

ContinueOnError=true, ReturnResponses=false

2 risposte: per 2 la proprietà Fault è impostata su un valore.

ContinueOnError=false, ReturnResponses=false

1 risposta: per 1 la proprietà Fault è impostata su un valore.

Un parametro RequestIndex nella risposta indica il numero di sequenza, a partire da zero, della richiesta a cui la risposta è associata. Nell'esempio precedente, per la terza richiesta l'indice è 2.

Limitazioni di runtime

Esistono vari vincoli correlati all'utilizzo dell'oggetto ExecuteMultipleRequest come descritto nell'elenco seguente.

  • Non è consentita alcuna ricorsione, pertanto ExecuteMultipleRequest non può richiamare ExecuteMultipleRequest. Un oggetto ExecuteMultipleRequest trovato nella raccolta di richieste genererà un errore per l'elemento di richiesta.

  • Dimensioni massime batch: esiste un limite al numero di richieste che è possibile aggiungere a una raccolta di richieste. Se tale limite viene superato, un errore viene generato prima che venga eseguita la prima richiesta. In genere viene impostato un limite di 1000 richiede sebbene sia possibile impostare questo importo massimo per la distribuzione di Microsoft Dynamics 365. L'impostazione della distribuzione per questo limite è BatchSize.

  • Limitazione di chiamate simultanee: per Microsoft Dynamics CRM Online esiste un limite di 2 esecuzioni simultanee di oggetti ExecuteMultipleRequest per organizzazione. Se tale limite viene superato, viene generato un errore di server occupato prima che venga eseguita la prima richiesta. Per distribuzioni in locale, il limite non è abilitato per impostazione predefinita. L'impostazione della distribuzione per questo limite è ExecuteAsyncPerOrgMaxConnectionsPerServer.

Gestire un errore relativo alle dimensioni batch

Come è consigliabile procedere quando la raccolta di richieste di input supera le dimensioni massime del batch? Il codice non può eseguire direttamente query in relazione alle dimensioni massime del batch tramite il servizio Web di distribuzione a meno che non venga eseguito con un account con il ruolo di amministratore della distribuzione.

È possibile utilizzare comunque un altro metodo. Quando il numero di richieste nella raccolta Requests di input supera le dimensioni massime consentite per il batch per un'organizzazione, la chiamata a ExecuteMultipleRequest restituisce un errore. Le dimensioni massime del batch vengono restituite nell'errore. Il codice può verificare tale valore, ridimensionare la raccolta di richieste di input in modo da rispettare il limite visualizzato e inviare nuovamente l'oggetto ExecuteMultipleRequest. Il seguente frammento di codice illustra parte di questa logica.


catch (FaultException<OrganizationServiceFault> fault)
{
    // Check if the maximum batch size has been exceeded. The maximum batch size is only included in the fault if it
    // the input request collection count exceeds the maximum batch size.
    if (fault.Detail.ErrorDetails.Contains("MaxBatchSize"))
    {
        int maxBatchSize = Convert.ToInt32(fault.Detail.ErrorDetails["MaxBatchSize"]);
        if (maxBatchSize < requestWithResults.Requests.Count)
        {
            // Here you could reduce the size of your request collection and re-submit the ExecuteMultiple request.
            // For this sample, that only issues a few requests per batch, we will just print out some info. However,
            // this code will never be executed because the default max batch size is 1000.
            Console.WriteLine("The input request collection contains %0 requests, which exceeds the maximum allowed (%1)",
                requestWithResults.Requests.Count, maxBatchSize);
        }
    }
    // Re-throw so Main() can process the fault.
    throw;
}

Catch fault As FaultException(Of OrganizationServiceFault)

    ' Check if the maximum batch size has been exceeded. The maximum batch size is only included in the fault if it
    ' the input request collection count exceeds the maximum batch size.
    If fault.Detail.ErrorDetails.Contains("MaxBatchSize") Then

        Dim maxBatchSize As Integer = Convert.ToInt32(fault.Detail.ErrorDetails("MaxBatchSize"))
        If maxBatchSize < requestWithResults.Requests.Count Then
            ' Here you could reduce the size of your request collection and re-submit the ExecuteMultiple request.
            ' For this sample, that only issues a few requests per batch, we will just print out some info. However,
            ' this code will never be executed because the default max batch size is 1000.
            Console.WriteLine("The input request collection contains %0 requests, which exceeds the maximum allowed (%1)", requestWithResults.Requests.Count, maxBatchSize)
        End If
    End If
    ' Re-throw so Main() can process the fault.
    Throw
End Try

Vedere anche

Execute
OrganizationRequest
OrganizationResponse
Utilizzare il servizio Web IOrganizationService per leggere e scrivere dati o metadati
Messaggi xRM nel servizio dell'organizzazione
Messaggi del servizio di individuazione
Messaggi CRM nel servizio di organizzazione
Importa dati

© 2017 Microsoft. Tutti i diritti sono riservati. Copyright