.NET Core 2中XmlSerialization失效求助:POST请求报HTTP 400错误
解决.NET Core 2.0中XmlSerializer序列化后POST请求被bd/o标签包裹的问题
嘿,这个问题我碰到过!你看到的bd和o标签其实是DataContractSerializer搞的鬼——说明你的请求根本没用上你指定的XmlSerializer,还是默认用了DataContractSerializer,这才导致API返回400错误(毕竟API端大概率期望的是XmlSerializer生成的标准XML结构)。
问题根源
在.NET Core 2.0中,HttpClient默认的XML媒体类型格式化器是DataContractSerializer,哪怕你以为自己指定了XmlSerializer,如果配置不到位,实际序列化逻辑还是会 fallback 到默认的DataContractSerializer。那些奇怪的bd、o标签就是它对对象进行包装的特殊格式,自然会被API拒绝。
具体解决方案
你需要明确给请求配置启用XmlSerializer的格式化器,这里有两种常用方式:
方式一:手动创建ObjectContent并指定XmlSerializer
直接构建带有正确格式化器的请求内容,确保序列化逻辑完全由XmlSerializer处理:
// 1. 创建Xml媒体类型格式化器,启用XmlSerializer var xmlFormatter = new XmlMediaTypeFormatter(); xmlFormatter.UseXmlSerializer = true; // 2. 用你的模型对象和格式化器创建请求内容 var requestContent = new ObjectContent<YourModelClass>(yourModelInstance, xmlFormatter); // 3. 发送POST请求 var httpClient = new HttpClient(); var response = await httpClient.PostAsync("https://your-api-endpoint", requestContent);
方式二:在依赖注入中配置HttpClient的格式化器
如果你的项目用了依赖注入管理HttpClient,可以在Startup.cs里全局配置,确保所有请求都用XmlSerializer:
services.AddHttpClient("YourApiClient") .ConfigureHttpClient(client => { client.BaseAddress = new Uri("https://your-api-base-url"); client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/xml")); }) .AddHttpMessageHandler(sp => { var formatter = new XmlMediaTypeFormatter(); formatter.UseXmlSerializer = true; // 这里可以进一步配置格式化器,比如设置默认命名空间等 return new HttpClientHandler(); });
额外注意事项
- 确保你的模型类符合XmlSerializer的要求:必须有无参数的公共构造函数,属性要是公共可读写的;如果需要自定义XML结构,可以给类/属性加上
[XmlRoot]、[XmlElement]等特性。 - 用Fiddler重新抓包验证:确认请求内容不再有
bd、o标签,而是标准的XML结构(比如根节点是你的模型类名或指定的XmlRoot名称)。
内容的提问来源于stack exchange,提问作者LP13
相关产品推荐
相关产品推荐

