You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Dynamics 365 CRM插件创建salesorder失败,如何获取有效错误信息?

解决Dynamics 365 CRM插件创建SalesOrder失败的问题

我来帮你一步步拆解这个问题,先搞定模糊的错误提示,再解决创建订单失败的核心问题。

一、获取详细错误信息(用Plug-in Profiler)

你看到的Download the details and load with Plug-in Profiler是Dynamics的标准提示,专门用来捕获插件运行时的具体异常。操作步骤很简单:

  • 打开Dynamics 365的高级设置,启动插件注册工具(如果没安装,直接从微软官方渠道下载安装即可)。
  • 在工具里找到你的OrderTest插件,点击顶部的启动探查器,跟着提示配置要捕获的消息、实体(和你插件注册的触发条件保持一致)。
  • 再次触发插件运行(比如手动执行触发插件的操作),这时候会生成错误日志文件,下载后回到插件注册工具,点击加载探查器日志,就能看到完整的异常堆栈和具体错误描述了。

二、创建SalesOrder失败的核心原因(你的代码问题)

看了你的代码,我发现最关键的问题:SalesOrder有必填字段你没设置,这是导致创建失败的最常见原因。
Dynamics 365中,salesorder实体至少需要以下必填字段:

  • name:你已经设置了
  • customerid:关联的客户(Account或Contact,这是绝对必填项,没有的话系统根本不允许创建订单)
  • 部分环境中currencyid(货币)也是必填的,如果你的系统默认货币没有自动填充,也需要手动设置。

三、修改后的代码示例

我帮你调整了代码,补上了必填的customerid字段(你需要替换成实际的客户ID),同时优化了错误追踪的信息:

using System;
using System.ServiceModel;
using Microsoft.Xrm.Sdk;
using Microsoft.Xrm.Sdk.Query;

namespace Microsoft.Crm.Sdk.Samples
{
    public class OrderTest : IPlugin
    {
        public void Execute(IServiceProvider serviceProvider)
        {
            ITracingService tracingService = (ITracingService)serviceProvider.GetService(typeof(ITracingService));
            IPluginExecutionContext context = (IPluginExecutionContext)serviceProvider.GetService(typeof(IPluginExecutionContext));

            if (context.InputParameters.Contains("Target") && context.InputParameters["Target"] is Entity entity)
            {
                // 如果你的插件注册在SalesOrder的Create消息上,这个判断没问题;如果是其他实体触发,需要调整逻辑
                if (entity.LogicalName != "salesorder") return;

                try
                {
                    tracingService.Trace("OrderTestPlugin: 开始创建销售订单");
                    
                    Entity salesorder = new Entity("salesorder");
                    salesorder["name"] = "order test";
                    
                    // 必须设置客户关联,替换成你实际的Account或Contact的ID
                    salesorder["customerid"] = new EntityReference("account", new Guid("你的客户GUID"));
                    
                    // 如果系统要求手动设置货币,取消注释并替换成你的默认货币ID
                    // salesorder["currencyid"] = new EntityReference("transactioncurrency", new Guid("你的货币GUID"));

                    IOrganizationServiceFactory serviceFactory = (IOrganizationServiceFactory)serviceProvider.GetService(typeof(IOrganizationServiceFactory));
                    IOrganizationService service = serviceFactory.CreateOrganizationService(context.UserId);

                    Guid orderId = service.Create(salesorder);
                    tracingService.Trace("OrderTestPlugin: 销售订单创建成功,ID: {0}", orderId);
                }
                catch (FaultException<OrganizationServiceFault> ex)
                {
                    tracingService.Trace("OrderTestPlugin: 组织服务错误 - {0}", ex.Detail.Message);
                    throw new InvalidPluginExecutionException($"创建销售订单失败: {ex.Detail.Message}", ex);
                }
                catch (Exception ex)
                {
                    tracingService.Trace("OrderTestPlugin: 通用异常 - {0}", ex.ToString());
                    throw new InvalidPluginExecutionException("创建销售订单时发生未知错误", ex);
                }
            }
        }
    }
}

四、额外排查要点

  • 权限问题:确认插件运行使用的用户(context.UserId对应的用户)有创建SalesOrder的权限,以及读取关联客户的权限。
  • 插件注册触发条件:检查你的插件注册的是哪个消息(比如Create)和实体,如果注册在其他实体上,而代码里判断entity.LogicalName != "salesorder"就返回,那插件根本不会执行创建逻辑。
  • 循环触发风险:如果插件注册在SalesOrder的Create消息上,要注意避免循环触发(比如创建订单后又触发同一个插件),可以通过上下文的Depth属性判断。

内容的提问来源于stack exchange,提问作者Mikou

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 09:05:58