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
相关产品推荐
相关产品推荐

