Dynamics 365 CE的插件/自定义工作流活动中调用Web API示例代码

微软动态CRM专家罗勇 ,回复325或者20190428可方便获取本文,同时可以在第一间得到我发布的最新博文信息,follow me!

现在Web API越来越流行,有时候为了程序更加健壮,需要在插件/自定义工作流活动中调用Web API,请求数据内容和返回数据内容都是JSON格式,我这里准备了一些代码示例,方便以后参考,也欢迎各位读者提供建议,我的C#水平有限,望各位不吝赐教。

插件代码示例:

using System;
using System.ServiceModel;
using Microsoft.Xrm.Sdk;
using System.Runtime.Serialization.Json;
using System.IO;
using System.Text;
using System.Net.Http;
using System.Threading.Tasks;

namespace Plugins
{
    public class PreAccountCreate : IPlugin
    {
        public void Execute(IServiceProvider serviceProvider)
        {
            ITracingService tracingService = (ITracingService)serviceProvider.GetService(typeof(ITracingService));
            tracingService.Trace("Enter PreAccountCreate on {0}", DateTime.Now.ToString());
            IPluginExecutionContext context = (IPluginExecutionContext)serviceProvider.GetService(typeof(IPluginExecutionContext));
            if (context.InputParameters.Contains("Target") && context.InputParameters["Target"] is Entity)
            {
                Entity currentEntity = (Entity)context.InputParameters["Target"];
                IOrganizationServiceFactory serviceFactory = (IOrganizationServiceFactory)serviceProvider.GetService(typeof(IOrganizationServiceFactory));
                IOrganizationService service = serviceFactory.CreateOrganizationService(context.UserId);
                try
                {
                    string requestJson = string.Empty;
                    var request = new GetTeamMembersRequest()
                    {
                        TeamName = "Thomas Luo",
                        WordConnector = ";"
                    };
                    var serializer = new DataContractJsonSerializer(typeof(GetTeamMembersRequest));
                    using (var ms = new MemoryStream())
                    {
                        serializer.WriteObject(ms, request);
                        requestJson = Encoding.UTF8.GetString(ms.ToArray());
                    }
                    tracingService.Trace("HTTP POST REQUEST BODY = {0}", requestJson);
                    var responseContent = PostApiAsync(requestJson).Result;
                    tracingService.Trace("HTTP POST RESPONSE CONTENT = {0}", responseContent);
                    using (var ms = new MemoryStream(Encoding.Unicode.GetBytes(responseContent)))
                    {
                        DataContractJsonSerializer deseralizer = new DataContractJsonSerializer(typeof(GetTeamMembersResponse));
                        GetTeamMembersResponse repsonse = (GetTeamMembersResponse)deseralizer.ReadObject(ms);
                        //这里就是调用返回内容
                        //throw new InvalidPluginExecutionException(repsonse.UserEmailAddrs + repsonse.UserFullName + repsonse.UserIds);
                    }
                }
                catch (FaultException<OrganizationServiceFault> ex)
                {
                    throw new InvalidPluginExecutionException("An error occurred in PreAccountCreate.", ex);
                }
                catch (Exception ex)
                {
                    tracingService.Trace("PreAccountCreate unexpected exception: {0}", ex.Message);
                    throw;
                }
            }
            tracingService.Trace("Leave PreAccountCreate on {0}", DateTime.Now.ToString());
        }

        private async Task<string> PostApiAsync(string requestJson)
        {
            string returnVal = string.Empty;
            using (var client = new HttpClient())
            {
                var content = new StringContent(requestJson, Encoding.UTF8, "application/json");
                var response = client.PostAsync(@"https://thomaswebapi.azurewebsites.net/api/CustomerEngagement", content).Result;
                if (response.IsSuccessStatusCode)
                {
                    returnVal = await response.Content.ReadAsStringAsync();
                }
                else
                {
                    throw new InvalidPluginExecutionException(response.Content.ReadAsStringAsync().Result);
                }
            }
            return returnVal;
        }
    }

    public class GetTeamMembersRequest
    {
        public string TeamName { get; set; }

        public string WordConnector { get; set; }
    }

    public class GetTeamMembersResponse
    {
        public string UserIds { get; set; }

        public string UserEmailAddrs { get; set; }

        public string UserFullName { get; set; }

        public string ResultCode { get; set; }

        public string ResultDesc { get; set; }
    }
}

 

自定义工作流活动代码示例:

using Microsoft.Xrm.Sdk;
using Microsoft.Xrm.Sdk.Workflow;
using System;
using System.Activities;
using System.IO;
using System.Net.Http;
using System.Runtime.Serialization.Json;
using System.ServiceModel;
using System.Text;
using System.Threading.Tasks;

namespace Flows
{
    public class InvokeWebApi : CodeActivity
    {
        protected override void Execute(CodeActivityContext executionContext)
        {
            ITracingService tracingService = executionContext.GetExtension<ITracingService>();
            tracingService.Trace("Enter InvokeWebApi on {0}", DateTime.Now.ToString());
            IWorkflowContext context = executionContext.GetExtension<IWorkflowContext>();
            IOrganizationServiceFactory serviceFactory = executionContext.GetExtension<IOrganizationServiceFactory>();
            IOrganizationService orgService = serviceFactory.CreateOrganizationService(context.UserId);
            try
            {
                string requestJson = string.Empty;
                var request = new GetTeamMembersRequest()
                {
                    TeamName = "Thomas Luo",
                    WordConnector = ";"
                };
                var serializer = new DataContractJsonSerializer(typeof(GetTeamMembersRequest));
                using (var ms = new MemoryStream())
                {
                    serializer.WriteObject(ms, request);
                    requestJson = Encoding.UTF8.GetString(ms.ToArray());
                }
                tracingService.Trace("HTTP POST REQUEST BODY = {0}", requestJson);
                var responseContent = PostApiAsync(requestJson).Result;
                tracingService.Trace("HTTP POST RESPONSE CONTENT = {0}", responseContent);
                using (var ms = new MemoryStream(Encoding.Unicode.GetBytes(responseContent)))
                {
                    DataContractJsonSerializer deseralizer = new DataContractJsonSerializer(typeof(GetTeamMembersResponse));
                    GetTeamMembersResponse repsonse = (GetTeamMembersResponse)deseralizer.ReadObject(ms);
                    //这里就是调用返回内容
                    //throw new InvalidPluginExecutionException(repsonse.UserEmailAddrs + repsonse.UserFullName + repsonse.UserIds);
                }
            }
            catch (FaultException<OrganizationServiceFault> ex)
            {
                throw new InvalidPluginExecutionException("An error occurred in InvokeWebApi.", ex);
            }
            catch (Exception ex)
            {
                tracingService.Trace("InvokeWebApi unexpected exception: {0}", ex.Message);
                throw;
            }
            tracingService.Trace("Leave InvokeWebApi on {0}", DateTime.Now.ToString());
        }

        private async Task<string> PostApiAsync(string requestJson)
        {
            string returnVal = string.Empty;
            using (var client = new HttpClient())
            {
                var content = new StringContent(requestJson, Encoding.UTF8, "application/json");
                var response = client.PostAsync(@"https://thomaswebapi.azurewebsites.net/api/CustomerEngagement", content).Result;
                if (response.IsSuccessStatusCode)
                {
                    returnVal = await response.Content.ReadAsStringAsync();
                }
                else
                {
                    throw new InvalidPluginExecutionException(response.Content.ReadAsStringAsync().Result);
                }
            }
            return returnVal;
        }
    }

    public class GetTeamMembersRequest
    {
        public string TeamName { get; set; }

        public string WordConnector { get; set; }
    }

    public class GetTeamMembersResponse
    {
        public string UserIds { get; set; }

        public string UserEmailAddrs { get; set; }

        public string UserFullName { get; set; }

        public string ResultCode { get; set; }

        public string ResultDesc { get; set; }
    }
}

 

当然若你使用HTTP GET,参考下面的示例:

        private async Task<string> GetApiAsync(string OrderNumber)
        {
            string returnVal = string.Empty;
            using (var client = new HttpClient())
            {
                client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
                var response = client.GetAsync(string.Format("https://thomaswebapi.azurewebsites.net/api/Order?OrderNo={0}",OrderNumber)).Result;
                if (response.IsSuccessStatusCode)
                {
                    returnVal = await response.Content.ReadAsStringAsync();
                }
                else
                {
                    throw new InvalidPluginExecutionException(response.Content.ReadAsStringAsync().Result);
                }
            }
            return returnVal;
        }

 

posted @ 2019-04-28 22:50  微软MVP(15-18)罗勇  阅读(585)  评论(1编辑  收藏  举报