zoukankan      html  css  js  c++  java
  • 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;
            }
  • 相关阅读:
    git的优秀教程
    线性表的顺序存储结构和链式存储结构的比较
    python3基础知识学习记录
    thinkPHP为什么设置一个单入口文件?
    2017年读过的专业书
    DFS(深度优先搜索)模板
    HDOJ2553-N皇后问题(DFS)
    POJ(2784)Buy or Build
    并查集 分类: 并查集 2015-07-09 16:32 0人阅读 评论(0) 收藏
    Number of Containers(数学) 分类: 数学 2015-07-07 23:42 1人阅读 评论(0) 收藏
  • 原文地址:https://www.cnblogs.com/luoyong0201/p/Dynamics_365_Invoke_Web_API_In_Plugin_CodeActivity.html
Copyright © 2011-2022 走看看