You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

C# WebAPI如何将对象序列化为纯XML格式?解决默认返回JSON、结果为字符串的问题

解决Web API返回XML为字符串格式的问题

你遇到的核心问题是Action返回String类型时,Web API默认会用JSON格式化器处理,把字符串序列化为JSON字符串(所以被双引号包裹),同时响应的Content-Typeapplication/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

火山引擎 最新活动