You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

向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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 00:01:09