如何基于现有C#代码向Dynamics 365批量上传文件至注释与附件?
批量向Dynamics 365注释上传多个文件的实现方案
要实现批量上传,核心是复用单文件上传的逻辑,同时借助Dynamics 365的ExecuteMultipleRequest批量提交请求——这种方式能减少API调用次数,比循环调用单次Create更高效,尤其适合多文件场景。
完整实现代码
// 1. 准备待上传的文件集合(实际场景可从本地、数据库等读取) var filesToUpload = new List<(string FileName, string Base64Content)> { ("工单日志.txt", Convert.ToBase64String(File.ReadAllBytes(@"C:\uploads\log.txt"))), ("故障报告.pdf", Convert.ToBase64String(File.ReadAllBytes(@"C:\uploads\report.pdf"))), ("现场截图.png", Convert.ToBase64String(File.ReadAllBytes(@"C:\uploads\screenshot.png"))) }; // 2. 配置关联的实体信息(这里关联Incident工单) string entityTypeAttachment = "incident"; Guid incidentGuid = new Guid("替换为目标工单的GUID"); // 改成实际要关联的记录ID // 3. 创建批量请求对象 var executeMultipleRequest = new ExecuteMultipleRequest { Settings = new ExecuteMultipleSettings { ContinueOnError = true, // 单个文件上传失败不中断整个批量任务 ReturnResponses = true // 返回每个请求的执行结果,方便排查问题 }, Requests = new OrganizationRequestCollection() }; // 4. 遍历文件,生成对应的Annotation(注释)创建请求 foreach (var file in filesToUpload) { Entity noteAttachment = new Entity("annotation"); noteAttachment["objectid"] = new EntityReference(entityTypeAttachment, incidentGuid); noteAttachment["filename"] = file.FileName; noteAttachment["isdocument"] = true; noteAttachment["documentbody"] = file.Base64Content; // 可选:给注释添加描述文本,方便后续识别 noteAttachment["notetext"] = $"批量上传附件:{file.FileName}"; // 将单个创建请求加入批量集合 executeMultipleRequest.Requests.Add(new CreateRequest { Target = noteAttachment }); } // 5. 执行批量请求 var response = (ExecuteMultipleResponse)svc.Execute(executeMultipleRequest); // 可选:遍历响应结果,打印上传状态 foreach (var responseItem in response.Responses) { if (responseItem.Fault != null) { Console.WriteLine($"文件【{filesToUpload[responseItem.RequestIndex].FileName}】上传失败:{responseItem.Fault.Message}"); } else { Console.WriteLine($"文件【{filesToUpload[responseItem.RequestIndex].FileName}】上传成功,注释ID:{((CreateResponse)responseItem.Response).id}"); } }
关键细节说明
- 文件格式要求:Dynamics 365要求文件内容必须是Base64编码字符串,所以本地文件需要先用
Convert.ToBase64String转换。 - 批量请求优势:
ExecuteMultipleRequest会把多个请求打包成单次API调用,避免频繁请求导致的性能损耗,同时支持错误隔离。 - 参数灵活配置:如果希望某个文件失败就终止全部任务,可把
ContinueOnError设为false;不需要返回结果的话,ReturnResponses设为false能减少数据传输量。
内容的提问来源于stack exchange,提问作者Rangarajakrishnan
相关产品推荐
相关产品推荐

