Разработка
02
Сен
0

Бэкап Решений с помощью плагина

Этот плагин выполняет выгрузку всех неуправляемых Решений и прикрепляет их к созданной задаче:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using System.ServiceModel;
using Microsoft.Xrm.Sdk;
using Microsoft.Xrm.Sdk.Messages;
using Microsoft.Xrm.Sdk.Query;
using Microsoft.Xrm.Sdk.Client;
using Microsoft.Crm.Sdk.Messages;
using System.ServiceModel.Description;
using System.Runtime.Serialization;

namespace SolutionBackup
{
    // PreSolutionBackup Plugin.
    public class PreSolutionBackup : IPlugin
    {
        public void Execute(IServiceProvider serviceProvider)
        {
            IPluginExecutionContext context = (IPluginExecutionContext)serviceProvider.GetService(typeof(IPluginExecutionContext));
            try
            {
                IOrganizationServiceFactory serviceFactory = (IOrganizationServiceFactory)serviceProvider.GetService(typeof(IOrganizationServiceFactory));
                IOrganizationService service = serviceFactory.CreateOrganizationService(context.UserId);

                // Запрос для возвращения Неуправляемых Решений
                QueryExpression query = new QueryExpression
                {
                    EntityName = "solution",
                    ColumnSet = new ColumnSet("friendlyname", "uniquename", "version"),
                    Criteria = new FilterExpression()
                    {
                        Conditions =
                        {
                            // Только неуправляемые
                            new ConditionExpression("ismanaged", ConditionOperator.Equal, false),
                            new ConditionExpression("isvisible", ConditionOperator.Equal, true),
                            new ConditionExpression("uniquename", ConditionOperator.NotEqual, "Default")
                        }
                    }
                };

                // Возвращаем Решения и проверяем что вернулась хотя бы одно Решение
                EntityCollection solutions = service.RetrieveMultiple(query);
                if (solutions.Entities.Count == 0) return;

                // Создаем Задачу, к которой будем крепить Решения
                Entity task = new Entity("task");
                task["subject"] = string.Format("Бэкап - {0}", DateTime.Now);
                Guid taskId = service.Create(task);

                // Просматриваем Решения
                foreach (Entity solution in solutions.Entities)
                {
                    // Возвращаем само Решение
                    var exportXml = ExportSolution((String)solution["uniquename"], service);

                    // Создаем Примечание, при этом вкладываем в него экспортированиие Решение и присоединяем к Задаче
                    if (exportXml != null)
                    {
                        Entity Annotation = new Entity("annotation");
                        Annotation["subject"] = string.Format("Решение - {0}.", (String)solution["uniquename"]);
                        Annotation["notetext"] = string.Format("Дата: {0}.", DateTime.Now);
                        Annotation["objectid"] = new EntityReference("task", taskId);
                        Annotation["isdocument"] = true;
                        Annotation["filename"] = string.Format("{0}_{1}.zip", (String)solution["friendlyname"], DateTime.Now);
                        Annotation["mimetype"] = "application/zip";
                        Annotation["documentbody"] = Convert.ToBase64String(exportXml);
                        
                        service.Create(Annotation);
                    }
                }
                
            }
            catch (FaultException<OrganizationServiceFault> ex)
            {
                throw new InvalidPluginExecutionException("Ошибка: " + ex);
            }
        }

        // Метод выгружает Решение
        private byte[] ExportSolution(string solutionName, IOrganizationService service)
        {
            try
            {
                ExportSolutionRequest exportSolutionRequest = new ExportSolutionRequest();
                exportSolutionRequest.SolutionName = solutionName;
                ExportSolutionResponse exportSolutionResponse = (ExportSolutionResponse)service.Execute(exportSolutionRequest);
                byte[] exportXml = exportSolutionResponse.ExportSolutionFile;
                return exportXml;
            }
            catch (Exception ex)
            {
                return null;
            }
        }
    }
}

Зарегистрируйте плагин на сообщение Publish All (лучше асинхронно) и каждый раз когда будет нажиматься кнопка Опубликовать все, будет создаваться бэкап текущих Решений.


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

*

code