向Dynamics 365的OData数据实体POST请求时出现错误请求
问题分析与解决
第一个POST请求的问题
- 缺少必填字段:从你第二个请求尝试添加
HireActionId的操作来看,该字段大概率是实体的必填项(比如主键字段),但第一个请求未传入,导致Dynamics验证失败返回Bad Request。 - 字段名称不匹配:Dynamics公共数据实体的字段使用逻辑名称(通常带解决方案前缀,如
hirea_HireActionId),如果你的HireAction类属性名称与实体逻辑名称不一致,序列化后的JSON字段名将无法被Dynamics识别。可以通过添加JsonProperty特性指定对应逻辑名称,示例:
public class HireAction { [JsonProperty("hirea_companyname")] public string CompanyName { get; set; } [JsonProperty("hirea_movieid")] public string MovieId { get; set; } [JsonProperty("hirea_hireactionid")] public string HireActionId { get; set; } [JsonProperty("hirea_hireactionstatus")] public string HireActionStatus { get; set; } }
(请将示例中的前缀替换为你实际使用的解决方案前缀)
第二个POST请求的问题
该请求存在明显的格式错误:
- Content-Type与请求体格式不匹配:你设置了
ContentType = "application/json",但实际发送的是form-urlencoded格式的字符串(CompanyName='DEMF'&...),Dynamics无法解析这种格式的请求体。 - 冗余的序列化操作:你将form格式的字符串再次用
JsonConvert.SerializeObject序列化,导致最终发送的内容是一个JSON字符串包裹的form内容,完全不符合接口要求。
修正后的HttpClient请求示例
HireAction hireAction = new HireAction() { CompanyName = "DEMF", MovieId = "DEMF-000000014", HireActionId = "12345", // 添加必填主键字段 HireActionStatus = "Created" }; // 确保类属性与实体逻辑名称匹配,或添加JsonProperty特性 string jsonMessage = JsonConvert.SerializeObject(hireAction); using (HttpClient client = new HttpClient()) { HttpRequestMessage requestMessage = new HttpRequestMessage( HttpMethod.Post, "MyDynamicsEnvironmentName/data/HireActions?cross-company=true" ); requestMessage.Content = new StringContent(jsonMessage, Encoding.UTF8, "application/json"); requestMessage.Headers.Add("Authorization", AuthResult.AuthorizationHeader); // 添加Accept头,明确指定接收JSON格式响应 requestMessage.Headers.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); HttpResponseMessage response = client.SendAsync(requestMessage).Result; // 调试关键:读取错误响应内容,获取详细原因 if (!response.IsSuccessStatusCode) { string errorDetails = response.Content.ReadAsStringAsync().Result; // 输出errorDetails可查看具体验证错误,比如缺少字段、值无效等 } }
额外调试建议
- 序列化后打印
jsonMessage,确认字段名和值是否符合Dynamics实体的要求。 - 收到Bad Request时,务必读取响应内容,Dynamics会返回具体错误原因,这是定位问题最直接的方式。
内容的提问来源于stack exchange,提问作者Kai
相关产品推荐
相关产品推荐

