这两天在用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
javascript
{
"SelectedTemplate": {
"documenttemplateid": "5aac6ad6-af13-f011-998a-002248582342",
"@odata.type": "Microsoft.Dynamics.CRM.documenttemplate"
},
"EntityTypeCode": 10629,
"SelectedRecords": [
"8b59ddeb-b00a-f011-bae3-000d3aa1971f"
]
}
SelectedRecords接受的是一个字符串,而我设置成了数组,正确的是下面这样
javascript
{
"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中的参数替换成你的就行,可以用来测试
javascript
(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的构造
cs
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的构造参考
