这两天在用ExportPdfTemplate做pdf导出功能时,遇到了如下问题InnerException : Microsoft.OData.ODataException: An unexpected 'StartArray' node was found when reading from the JSON reader. A 'PrimitiveValue' node was expected.
我的场景是使用power automate根据单据的状态变化触发,向特定用户发送带pdf附件的邮件通知,pdf附件是基于Word模版生成而来
主要是通过ExportPdfTemplate这个Action,在automate中一个http请求拿到base64的文件流后赋值给send mail操作的附件里
参考的是这篇文章,在构造body的时候忽略了SelectedRecords这个参数的格式,浪费了我很多时间去解决问题
如下是最初的错误body
{"SelectedTemplate": {"documenttemplateid": "5aac6ad6-af13-f011-998a-002248582342","@odata.type": "Microsoft.Dynamics.CRM.documenttemplate"},"EntityTypeCode": 10629,"SelectedRecords": ["8b59ddeb-b00a-f011-bae3-000d3aa1971f"]
}
SelectedRecords接受的是一个字符串,而我设置成了数组,正确的是下面这样
{"SelectedTemplate": {"documenttemplateid": "5aac6ad6-af13-f011-998a-002248582342","@odata.type": "Microsoft.Dynamics.CRM.documenttemplate"},"EntityTypeCode": 10629,"SelectedRecords": "[\"8b59ddeb-b00a-f011-bae3-000d3aa1971f"\]"
}
下面是一段前端示例代码,在你登录D365的情况下,可以打开F12,在console中直接可以用,只需要把body中的EntityTypeCode,documenttemplateid, SelectedRecords中的参数替换成你的就行,可以用来测试
(async function () {const url = "https://xx-dev.crm5.dynamics.com/api/data/v9.2/ExportPdfDocument"; // 替换组织域名var body={"EntityTypeCode": 10629,"SelectedTemplate": {"@odata.type": "Microsoft.Dynamics.CRM.documenttemplate","documenttemplateid": "5aac6ad6-af13-f011-998a-002248582342"},"SelectedRecords": "[\"{8b59ddeb-b00a-f011-bae3-000d3aa1971f}\"]"
}const response = await fetch(url, {method: "POST",headers: {"Content-Type": "application/json","OData-MaxVersion": "4.0","OData-Version": "4.0","Accept": "application/json"},body: JSON.stringify(body)});if (!response.ok) {const errorText = await response.text();console.error("Error exporting PDF:", errorText);} else {const result = await response.json();console.log("PDF Exported:", result);// 可选:将结果中的 PDF 下载到本地const link = document.createElement('a');link.href = "data:application/pdf;base64," + result.PdfFile;link.download = "exported-document.pdf";link.click();}
})();
如下是后端C#代码中的代码示例,主要关注body的构造
public void ExportPDF(){string actionParams = "{ " +"\"EntityTypeCode\": 106029, " +"\"SelectedTemplate\": { " +"\"@odata.type\": \"Microsoft.Dynamics.CRM.documenttemplate\", " +"\"documenttemplateid\": \"eb6b70cf-542e-ed11-9daf-0017fa02473a\" " +"}, " +"\"SelectedRecords\": \"[\"{72AFD26F-F337-ED11-9DAF-0017FA055BEE}\"]\"" +"}";var _service = new MSCRMService();string result = _service.CallCrmAction("", "", "ExportPdfDocument", actionParams);}
如下是power automate中的的body的构造参考