Как использовать C # Web API в Dynamics 365

Я использую онлайн-экземпляр Dynamics 365. Я создал C # Web API для экспорта данных из объекта активности. Когда я запускаю его из визуальной студии, он работает нормально.

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

using System;
using System.Collections.Generic;
using System.Configuration;
using System.IO;
using System.Linq;
using System.ServiceModel;
using Microsoft.Crm.Sdk.Messages;
using Microsoft.Xrm.Client;
using Microsoft.Xrm.Client.Services;
using Microsoft.Xrm.Sdk;
using System.Windows.Forms;

namespace Experiments
{
    class Program
    {
        private static OrganizationService _orgService;
        static void Main(string[] args)
        {
            try
            {
                CrmConnection connection = CrmConnection.Parse(ConfigurationManager.ConnectionStrings["CrmOnline"].ConnectionString);

                using (_orgService = new OrganizationService(connection))
                {

                    var exportToExcelRequest = new OrganizationRequest("ExportToExcel");
                    exportToExcelRequest.Parameters = new ParameterCollection();
                    //Has to be a savedquery aka "System View" or userquery aka "Saved View" 
                    //The view has to exist, otherwise will error out
                    exportToExcelRequest.Parameters.Add(new KeyValuePair<string, object>("View", new EntityReference("savedquery", new Guid("{00000000-0000-0000-00AA-000010001902}"))));
                    exportToExcelRequest.Parameters.Add(new KeyValuePair<string, object>("FetchXml", @"<?xml version='1.0'?>
                    <fetch distinct='false' mapping='logical' output-format='xml-platform' version='1.0'>
                       <entity name='activitypointer'>
                          <attribute name='subject'/>
                          <attribute name='ownerid'/>
                          <attribute name='prioritycode'/>
                          <attribute name='regardingobjectid'/>
                          <attribute name='activitytypecode'/>
                          <attribute name='statecode'/>
                          <attribute name='scheduledstart'/>
                          <attribute name='scheduledend'/>
                          <attribute name='activityid'/>
                          <attribute name='instancetypecode'/>
                          <attribute name='community'/>
                          <attribute name='senton'/>
                          <attribute name='statuscode'/>
                          <order descending='false' attribute='scheduledend'/>
                          <filter type='and'>
                             <condition attribute='actualdurationminutes' value='43800' operator='le'/>
                          </filter>
                          <link-entity name='systemuser' alias='activitypointerowningusersystemusersystemuserid' link-type='outer' visible='false' to='owninguser' from='systemuserid'>
                              <attribute name='internalemailaddress'/>
                          </link-entity>
                          <link-entity name='email' alias='email_engagement' link-type='outer' visible='false' to='activityid' from='activityid'><attribute name='isemailfollowed'/>
                             <attribute name='lastopenedtime'/> 
                             <attribute name='delayedemailsendtime'/>
                          </link-entity>
                       </entity>
                   </fetch>"));
                    exportToExcelRequest.Parameters.Add(new KeyValuePair<string, object>("LayoutXml", @"
                    <grid name='resultset' object='2' jump='fullname' select='1' icon='1' preview='1'>
                        <row name='result' id='activitypointerid'>
                            <cell name='activitytypecode' width='150' />
                            <cell name='statecode' width='112' />
                            <cell name='scheduledstart' width='110' />
                            <cell name='scheduledend' width='110' />
                        </row>
                    </grid>"));
                    //need these params to keep org service happy
                    exportToExcelRequest.Parameters.Add(new KeyValuePair<string, object>("QueryApi", ""));
                    exportToExcelRequest.Parameters.Add(new KeyValuePair<string, object>("QueryParameters",new InputArgumentCollection()));
                    var exportToExcelResponse = _orgService.Execute(exportToExcelRequest);
                    if (exportToExcelResponse.Results.Any())
                    {
                       File.WriteAllBytes("Activities.xlsx", exportToExcelResponse.Results["ExcelFile"] as byte[]);
                    }
                }
            }
            catch (FaultException<OrganizationServiceFault> ex)
            {
                string message = ex.Message;
                throw;
            }
        }
    }
}

Thanks.

person Mohd Nazish    schedule 22.05.2018    source источник
comment
Я предполагаю, что вы уже пробовали нестандартные функции экспорта данных?   -  person Kelvin    schedule 06.02.2019


Ответы (2)


Я бы рекомендовал вам скомпилировать код C # как Action и включить это как шаг в рабочем процессе. См. здесь о том, как вызвать настраиваемое действие из рабочего процесса.

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


Обратите внимание, есть несколько решений для достижения того, о чем вы спрашиваете, я только что предложил одно. Другие решения, вероятно, будут включать JavaScript и вызов клиентской части веб-API.

person Dave Clark    schedule 22.05.2018
comment
Я искал точное решение, чтобы вызвать рабочий процесс для призыва к действию. Не могли бы вы объяснить, как мы можем настроить кнопку? При добавлении командного действия я вижу только Url Action и Javascript Action - person kamalpreet; 10.11.2018

Поскольку вы используете Dynamics 365 Online, я рекомендую вам создать приложение Microsoft FLOW с соединителем CDS. Надеюсь это поможет.

person Kelvin    schedule 05.02.2019