Разработка
13
Дек
7

Синхронизация кастомизации между организациями

Предположим такую ситуацию: есть развернутая среда CRM с несколькими организациями. Одна продуктивная, другая для разработки, ну а третья, например, для тестирования. При публикации кастомизации на одной какой-либо организации необходимо синхронизировать ее с оставшимися двумя. Нам уже приходилось это делать в полу-ручном режиме (с помощью утилит: E4DCustomizationsManager, CRM Configuration Manager), теперь посмотрим как это реализовать автоматически с помощью плагина.

Создайте новый плагин (подключите к нему нужные сборки и сервисы, и подпишите) и повесьте на него такой код:

using System;
using System.Collections.Generic;
using System.Text;
using System.Web.Services.Protocols;
using System.IO;
using Microsoft.Crm.Sdk;
using Microsoft.Crm.SdkTypeProxy;

namespace ExportPublishImport
{
    public class PluginClass : IPlugin
    {
        string Unsecure;
        // Сохраняем конфигурационные данные в переменной
        public PluginClass(string unsecure)
        {
            if (!String.IsNullOrEmpty(unsecure)) Unsecure = unsecure;
        }

        public void Execute(IPluginExecutionContext context)
        {
            try
            {
                if (context.MessageName.Equals("PublishAll"))
                {
                    // Экспортируем всю кастомизацию с текущей организации
                    ICrmService service = context.CreateCrmService(true);
                    ExportCompressedAllXmlRequest exportRequest = new ExportCompressedAllXmlRequest();
                    exportRequest.EmbeddedFileName = "All_CRM_Customizations.xml";

                    ExportCompressedAllXmlResponse exportResponse = (ExportCompressedAllXmlResponse)service.Execute(exportRequest);
                    byte[] compressedXml = exportResponse.ExportCompressedXml;

                    // Сохраняем копию на жестком диске
                    using (FileStream fs = new FileStream(@"C:\Customizations_Backup\AllCrmCustomizations.zip", FileMode.Create))
                    {
                        fs.Write(compressedXml, 0, compressedXml.Length);
                        fs.Close();
                    }

                    // Перебираем имена организаций переданные в параметрах
                    string[] orgs = Unsecure.Split(';');
                    foreach (string org in orgs)
                    {
                        // Импортируем кастомизацию в другие организации
                        CrmAuthenticationToken token = new CrmAuthenticationToken();
                        token.AuthenticationType = 0;
                        token.OrganizationName = org;

                        CrmService crmService = new CrmService();
                        crmService.CrmAuthenticationTokenValue = token;
                        crmService.Credentials = System.Net.CredentialCache.DefaultCredentials;
                        crmService.Timeout = 1000000;

                        ImportCompressedAllXmlRequest importRequest = new ImportCompressedAllXmlRequest();

                        importRequest.CompressedCustomizationXml = compressedXml;

                        ImportCompressedAllXmlResponse importResponse = (ImportCompressedAllXmlResponse)crmService.Execute(importRequest);
                    }
                }
            }
            catch (SoapException soapex)
            {
                throw new InvalidPluginExecutionException(soapex.Detail.InnerText);
            }
            catch (IOException ioex)
            {
                throw new InvalidPluginExecutionException(ioex.Message);
            }
        }
    }
}

Тут все очень просто: сначала выгружаем кастомизацию из текущей организации. На всякий случай сохраняем ее копию на жестком диске (делаем бэкап). Затем импортируем выгруженную кастомизацию в другие организации (имена которых были переданы в параметрах плагина). Зетс олл 🙂

Ну и последнее… зарегистрируйте плагин в MS CRM со следующими параметрами:

  • Сообщение: PublishAll
  • Объект: None
  • Stage: Post
  • Mode: Synchronous
  • Pipeline: Parent

После этого публикация кастомизации в той организации, в которпой зарегистрирован плагин, будет автоматически синхронизировать кастомизацию между другими организациями, перечисленными в параметрах шага.




Комментарии (7)
  • Паша 13.12.2010

    Спасибо! Очень интересное решение. Есть только один вопрос — почему не указываете URL в инстансе CrmService?

  • slivka_83 13.12.2010

    Наверно по дефолту текущий работает 🙂

  • Паша 13.12.2010

    Проверил. Если не заполнять — по умолчанию http://127.0.0.1:5555/mscrmservices/2007/crmservice.asmx

  • slivka_83 13.12.2010

    Ну, как минимум порт в умолчании лишний 🙂
    А Вы при открытии Plugin Registration Tool или при открытии сайта CRM использовали URL с IP 127.0.0.1 ? Может это повлияло? А если попробовать изменить на сетевой IP или имя компьютера? 🙂

  • Паша 13.12.2010

    Наверное был неправильно понят…

    Если вы создаёте инстанс CrmService то по умолчанию его свойство URL приобретает значение кототрое я указал.

  • slivka_83 13.12.2010

    Я все правильно понял…
    Но меня интересует почему оно приобретает такое значение? Это захардкодено где-то и описано в SDK? или зависит от конкретного развертывания?

  • Паша 13.12.2010

    Думаю не ошибусь, если при помощи рефлектора будет найдено дефолтовое значение у филда, которое лежит за свойством URL.

*

code