C# WebAPI如何将对象序列化为纯XML格式?解决默认返回JSON、结果为字符串的问题
解决Web API返回XML为字符串格式的问题
你遇到的核心问题是Action返回String类型时,Web API默认会用JSON格式化器处理,把字符串序列化为JSON字符串(所以被双引号包裹),同时响应的Content-Type是application/json,导致Postman识别为JSON。下面给你两种解决方案,推荐第一种更规范的方式:
方法1:使用Web API内置XML格式化器(推荐)
不需要手动序列化XML,让框架自动处理,还能支持内容协商(根据请求头返回JSON/XML)。
步骤1:修改Action返回类型
把GetEmployeeDetails的返回类型从String改成IHttpActionResult,直接返回Employee对象,让框架负责序列化:
public IHttpActionResult GetEmployeeDetails(int id) { var employee = employees.FirstOrDefault(e => e.EmployeeId == id); if (employee == null) { return NotFound(); // 替代手动抛出HttpResponseException } return Ok(employee); // 框架会自动根据配置序列化对象 }
步骤2:确保XML格式化器已启用
打开App_Start/WebApiConfig.cs,确认配置中启用了XML媒体类型格式化器(默认已包含,但可以显式添加确保生效):
public static void Register(HttpConfiguration config) { // 启用XML格式化器,支持application/xml请求/响应 config.Formatters.XmlFormatter.SupportedMediaTypes.Add( new System.Net.Http.Headers.MediaTypeHeaderValue("application/xml") ); // 路由配置(保留你原有的路由设置) config.MapHttpAttributeRoutes(); config.Routes.MapHttpRoute( name: "DefaultApi", routeTemplate: "api/{controller}/{id}", defaults: new { id = RouteParameter.Optional } ); }
测试效果
在Postman中:
- 可以在请求头添加
Accept: application/xml,强制返回XML - 或者直接请求,框架会根据默认配置返回XML(如果XML格式化器优先级更高,或者你移除JSON格式化器的话)
此时响应的Content-Type会是application/xml,内容是纯XML结构,不会有双引号包裹。
方法2:手动返回XML内容(适合必须手动序列化的场景)
如果你需要保留手动序列化的逻辑,不要返回String,而是返回HttpResponseMessage,并明确设置响应的媒体类型为application/xml:
public HttpResponseMessage GetEmployeeDetails(int id) { var employee = employees.FirstOrDefault(e => e.EmployeeId == id); if (employee == null) { return Request.CreateResponse(HttpStatusCode.NotFound); } var xml = GenerateXmlResponse(employee); // 创建响应,指定内容类型为XML var response = new HttpResponseMessage(HttpStatusCode.OK); response.Content = new StringContent(xml, Encoding.UTF8, "application/xml"); return response; }
这样返回的响应会正确标记为XML类型,Postman会识别为XML格式,内容也不会被双引号包裹。
额外提示
如果需要自定义XML序列化的结构(比如修改根节点名称、忽略某些属性),可以给Employee类添加XML序列化特性:
using System.Xml.Serialization; namespace JsonToXML2.Models { [XmlRoot("Employee")] // 指定根节点名称 public class Employee { [XmlElement("EmployeeID")] // 修改元素名称 public int EmployeeId { get; set; } public string EmployeeName { get; set; } public string Address { get; set; } public string Department { get; set; } } }
内容的提问来源于stack exchange,提问作者skr




