如何通过Dynamics 365的RetrieveMultipleRequest获取原始XML响应?
问题解答
核心结论
RetrieveMultipleRequest无法直接返回原始XML格式的响应,它默认返回的是强类型的EntityCollection对象(包含结构化的实体数据)。如果需要XML格式的结果,得自己对返回的EntityCollection进行序列化处理。
替代实现方案
1. 使用RetrieveMultipleRequest获取数据后序列化XML
先通过RetrieveMultipleRequest拿到实体集合,再将其序列化为XML。示例代码如下:
// 构造RetrieveMultiple请求 var retrieveRequest = new RetrieveMultipleRequest { Query = new FetchExpression(xml) // xml是你的FetchXML字符串 }; // 执行请求并获取响应 var retrieveResponse = (RetrieveMultipleResponse)ServiceClient.Execute(retrieveRequest); EntityCollection results = retrieveResponse.EntityCollection; // 将EntityCollection序列化为XML var serializer = new DataContractSerializer(typeof(EntityCollection)); using (var writer = new StringWriter()) using (var xmlWriter = XmlWriter.Create(writer)) { serializer.WriteObject(xmlWriter, results); string xmlResult = writer.ToString(); // 这里的xmlResult就是序列化后的XML字符串 }
2. 若需严格匹配原ExecuteFetchResponse的XML格式
如果必须和旧版ExecuteFetchResponse返回的原始XML结构完全一致,SDK没有直接替代API,这时可以考虑调用Dynamics 365的Web API端点,直接发送FetchXML请求获取XML响应:
// 示例:使用HttpClient调用Web API获取原始XML using (var client = new HttpClient()) { client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", accessToken); client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/xml")); string fetchXmlEncoded = Uri.EscapeDataString(xml); string url = $"{orgUrl}/api/data/v9.2/accounts?fetchXml={fetchXmlEncoded}"; // 替换为你的实体集或通用端点 HttpResponseMessage response = await client.GetAsync(url); string rawXmlResponse = await response.Content.ReadAsStringAsync(); }
补充说明
旧版ExecuteFetchRequest虽然没有标记Obsolete,但微软已不再推荐使用,官方文档明确引导使用RetrieveMultipleRequest配合FetchExpression来执行FetchXML查询,后者更符合SDK的强类型设计,也便于后续数据处理。
内容的提问来源于stack exchange,提问作者iquellis
相关产品推荐
相关产品推荐

