Создание плагина Dynamics CRM для выполнения внешней задачи - PullRequest
0 голосов
/ 14 марта 2019

Я экспериментирую с плагинами CRM. Моя конечная цель - создать плагин, который будет запускать другую программу, которая просто добавляет учетные данные проекта в файл Excel. Для моего примера проекта я просто следовал https://docs.microsoft.com/en-us/powerapps/developer/common-data-service/tutorial-write-plug-in. Приведенный здесь пример был превосходным и многому научил меня по плагинам. Проблема, с которой я сталкиваюсь, заключается в том, что всякий раз, когда я пытаюсь выполнить код, который не был включен в учебник, я получаю сообщение об ошибке, и процесс отладки даже не достигает моей точки останова. Когда я удаляю свой личный код из функции, он работает нормально.

public class PostCreateContact : IPlugin
{

    public void Execute(IServiceProvider serviceProvider)
    {


        IPluginExecutionContext context = (IPluginExecutionContext)serviceProvider.GetService(typeof(IPluginExecutionContext));
        //Process firstProc = new Process();
        //firstProc.StartInfo.FileName = "notepad++.exe";
        //firstProc.StartInfo.WorkingDirectory = "C:\\Program Files (x86)\\Notepad++\\notepad++.exe";
        //firstProc.EnableRaisingEvents = true;
        //firstProc.Start();
        if (context.InputParameters.Contains("Target")&& context.InputParameters["Target"] is Entity)
        {
            Entity entity = (Entity)context.InputParameters["Target"];
            try
            {
                Entity followup = new Entity("task");
                followup["subject"] = "Send e-mail to the new customer.";
                followup["description"] = "Follow up with the customer. Check if there are any new issues that need resolution.";
                followup["scheduledstart"] = DateTime.Now;
                followup["scheduledend"] = DateTime.Now.AddDays(2);
                followup["category"] = context.PrimaryEntityName;

                if (context.OutputParameters.Contains("id"))
                {
                    Guid regardingobjectid = new Guid(context.OutputParameters["id"].ToString());
                    string regardingobjectidType = "contact";
                    followup["regardingobjectid"] = new EntityReference(regardingobjectidType, regardingobjectid);
                    IOrganizationServiceFactory serviceFactory = (IOrganizationServiceFactory)serviceProvider.GetService(typeof(IOrganizationServiceFactory));
                    IOrganizationService service = serviceFactory.CreateOrganizationService(context.UserId);
                    service.Create(followup);
                }
            }
            catch (Exception ex)
            {
                throw new InvalidPluginExecutionException(ex.Message);
            }
        }
    }
}

5 строк кода, которые я прокомментировал, - это мой личный код, который я упомянул. Если бы я откомментировал эти строки. Код не поразит мою точку останова. Моя точка останова была установлена ​​ниже строки "public void Execute (IserviceProver servicerProvider)". Может ли кто-нибудь объяснить мне, почему он сразу не работает, когда я вставляю свой собственный код для выполнения задачи, не связанной с CRM?

Кроме того, кроме попытки открыть notepad ++, попытка выбросить окно сообщения также не будет работать.

Ответы [ 2 ]

3 голосов
/ 15 марта 2019

Природа плагинов заключается в том, что они работают с данными в системе Dynamics 365 или связываются с внешним миром через HTTP или HTTPS. Запись в локальный файл выходит за рамки того, для чего предназначены плагины.

Один из способов установить связь плагина с внешним миром - написать Azure-осведомленный плагин .

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

Чтобы отправить пользователю файл поддерживаемым способом, вы можете создать его как вложение заметки. Сделав это, вы можете просто отправить пользователю по электронной почте ссылку на эту заметку в Dynamics 365.

Если вы хотите, чтобы файл был доступен за пределами Dynamics 365, вы можете запустить Azure- осведомленный плагин, который прослушивает на основе Azure, извлечет файл вложения Note, загрузит его в облачную файловую службу, такую ​​как SharePoint или OneDrive, а затем отправит пользователю по электронной почте ссылку на файл.

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

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

2 голосов
/ 15 марта 2019

Я отмечу превосходный ответ Арона для тех, кто больше изучает визуальные эффекты. Ниже приводится описание того, что происходит при выполнении обычной операции CRUD в CRM: enter image description here

Сам плагин выполняется в шагах 2 или 4, в зависимости от того, как вы его зарегистрировали, но независимо от того, выполняется ли он в процессе онлайн-песочницы, который изолирован от всех других процессов на компьютере в облаке, который обрабатывает Это. Песочница накладывает дополнительные ограничения на ваш код, одним из которых является доступ к диску. Вы не можете получить доступ к любой части жесткого диска из плагина, поэтому попытка чтения или записи файла не удастся. И пытаться открыть приложение не имеет смысла, потому что даже если бы оно было разрешено, оно открывалось бы на каком-то веб-сервере в некотором веб-ферме в облаке Microsoft, а не на вашем локальном компьютере.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...