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

.NET 8使用IHttpClientFactory时POST参数自动转为驼峰命名的问题

问题解决:IHttpClientFactory请求体参数自动转驼峰的处理

问题根源

你使用的PostAsJsonAsync和ReadFromJsonAsync是.NET内置的HttpClient扩展方法,默认依赖System.Text.Json进行序列化/反序列化,而[DataMember]、[JsonProperty]是Newtonsoft.Json的专属特性,两者不兼容,因此这些特性不会生效。

解决方案

方案1:改用System.Text.Json的特性或配置

  • 单个属性指定名称:用System.Text.Json的[JsonPropertyName]特性替换Newtonsoft的特性:
    public class PostRequest
    {
        [JsonPropertyName("Request")]
        public Request? Request { get; set; }
    }
    
  • 全局配置序列化规则:注册命名客户端时,配置JsonSerializerOptions禁用自动驼峰命名:
    services.AddHttpClient("YourNamedClient")
            // 其他客户端配置(如请求头、委托处理器)
            .AddJsonOptions(options =>
            {
                // 取消自动驼峰转换,保持模型属性原命名
                options.JsonSerializerOptions.PropertyNamingPolicy = null;
            });
    

方案2:强制使用Newtonsoft.Json序列化

如果项目依赖Newtonsoft.Json,放弃内置的PostAsJsonAsync,手动序列化请求体:

// 用Newtonsoft序列化请求体
var jsonBody = JsonConvert.SerializeObject(requestBody);
var httpContent = new StringContent(jsonBody, Encoding.UTF8, "application/json");

// 发送POST请求
var response = await client.PostAsync(resource, httpContent, cancellationToken);

// 用Newtonsoft反序列化响应
var responseContent = await response.Content.ReadAsStringAsync(cancellationToken);
return JsonConvert.DeserializeObject<T>(responseContent);

额外说明

你编写的委托处理器(添加请求头、异常处理、审计日志)不会影响请求体的序列化逻辑——序列化是在调用PostAsJsonAsync时完成的,委托处理器仅负责请求发送前后的流程处理,和序列化过程无关。

内容的提问来源于stack exchange,提问作者शेखर

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 04:18:15