Разработка
24
Июл
0

ExecuteMultipleRequest

В CRM SDK 5.0.13 (и после 12 ролапа) было добавлен новый запрос – ExecuteMultipleRequest. Этот запрос дает возможность отправить на сервер множество одиночных запросов так, чтобы сервис выполнил запросы скопом, а не возвращал ответ после выполнения каждого запроса. В целом множество одиночных запросов выполняет такой круг: запрос – аутентификация – выполнение запроса – возвращение ответа. А ExecuteMultipleRequest позволяет сэкономить на втором и третьем шаге, тем самым существенно улучшив производительность, особенно при загрузке в CRM тысяч записей.

Каждый из одиночных запросов входящих в ExecuteMultipleRequest (CreateRequest, UpdateRequest и т.д.) будет независим от других запросов в той же самой «партии» и выполнятся в той последовательности в которой добавлены в коллекцию запроса (результаты возвращаются в том же порядке). Т.к. каждый отдельный запрос в пакете обрабатывается в изоляции, то с ним случится ошибка, то отката всего пакета по транзакции не произойдет.

Размер партии по умолчанию – 1000 запросов. Это значение можно изменить, но учтите, что если пакетик получится слишком большим, то система может не пропустить его из-за настроек веб-конфига сайта CRM (но это можно изменить). Также может потребоваться увеличить таймаут для объекта OrganizationProxy.

Рассмотрим пример консольного приложения, которое массово создаст 1000 записей:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Microsoft.Xrm.Sdk;
using Microsoft.Xrm.Sdk.Messages;
using Microsoft.Xrm.Sdk.Query;
using Microsoft.Xrm.Sdk.Client;
using System.ServiceModel;
using System.ServiceModel.Description;
using System.Runtime.Serialization;

namespace ExecuteMultiple
{
    class Program
    {
        static void Main(string[] args)
        {
            // Подключаемся к CRM
            ClientCredentials credentials = new ClientCredentials();
            credentials.Windows.ClientCredential = new System.Net.NetworkCredential("Administrator", "1йфя\"ЦЫЧ", "D2011");
            Uri uri = new Uri("http://win-ebu0m4kvf06/superfirma/XRMServices/2011/Organization.svc");
            OrganizationServiceProxy proxy = new OrganizationServiceProxy(uri, null, credentials, null);
            proxy.ServiceConfiguration.CurrentServiceEndpoint.Behaviors.Add(new ProxyTypesBehavior());
            IOrganizationService service = (IOrganizationService)proxy;

            Console.WriteLine("Creating 1000 contacts");

            // Формируем пакетный запрос
            ExecuteMultipleRequest emRequest = new ExecuteMultipleRequest
            {
                Requests = new OrganizationRequestCollection(),
                Settings = new ExecuteMultipleSettings
                {
                    // Задаем два праметра: должен ли запрос прекращатся если произошла ошибка и необходимо ли возвращать ответ
                    ContinueOnError = false,
                    ReturnResponses = true
                }
            };

            // Помещаем коллекцию запросов и помещаяем в пакетный запрос
            for (int i = 0; i < 1000; i++)
            {
                Entity contact = new Entity("contact");
                contact["firstname"] = "Ежик_" + i;
                contact["lastname"] = "Йоу";

                CreateRequest createRequest = new CreateRequest();
                createRequest.Target = contact;

                emRequest.Requests.Add(createRequest);
            }

            Console.WriteLine("Executing request");
            ExecuteMultipleResponse emResponse = (ExecuteMultipleResponse)service.Execute(emRequest);
            Console.WriteLine("Creation complete");

            var results = emResponse.Results;
        }
    }
}

Тут мы делаем следующее:

  1. Подключаемся к CRM;
  2. Формируем ExecuteMultipleRequest и задаем для него два параметра:
    • ContinueOnError – определяет, должен ли пакет продолжать выполнятся в случаи ошибки с одни из одиночных запросов;
    • ReturnResponses – необходимо ли возвращать ответ.
  3. Заполняем пакетный запрос одиночными запросами создания контакта;
  4. Отправляем пакетный запрос. Если будет возвращено результат, то будут возвращены два свойства:
    • IsFaulted – показывает была ли ошибка при обработке пакетного запроса;
    • Responses – массив ответов по каждому запросу.



Комментарии (0)

*

code