Utilizzare ExecuteMultiple migliorare le prestazioni per il carico dei dati in blocco
Data di pubblicazione: gennaio 2017
Si applica a: Dynamics 365 (online), Dynamics 365 (on-premises), Dynamics CRM 2016, Dynamics CRM Online
È possibile utilizzare il messaggio ExecuteMultipleRequest per supportare scenari con maggiore passaggio di messaggi in Microsoft Dynamics 365 (online e locale), soprattutto nel caso Microsoft Dynamics 365 (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 |
---|---|
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. |
|
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 365 (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.
Suggerimento
Per qualsiasi distribuzione Dynamics 365, un amministratore della distribuzione può impostare o modificare la limitazione.
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
Usa il Servizio organizzazione per leggere e scrivere dati o metadati.
Messaggi xRM nel servizio dell'organizzazione
Messaggi del servizio di individuazione
Messaggi Dynamics 365 nel servizio dell'organizzazione
Importa dati
Microsoft Dynamics 365
© 2017 Microsoft. Tutti i diritti sono riservati. Copyright