.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,提问作者शेखर
相关产品推荐
相关产品推荐

