为什么Web API不会将我的POCO作为XML返回?

时间:2013-03-05 11:49:00

标签: serialization asp.net-web-api poco

WebAPI忽略传入请求上的Accept:标头,并且似乎始终将我的POCO对象序列化为JSON。我正在使用WizTools RestClient来测试API调用,并设置请求HTTP标头:

GET /api/people/evh123
Accept: application/xml

如果我修改我的控制器以返回string[]或其他一些本机类型,我会按预期获得XML。我见过有几个人建议在我的Application_Start()方法中添加这一行:

GlobalConfiguration.Configuration.Formatters.XmlFormatter.UseXmlSerializer = true;

但在我的情况下,这没有任何区别。

我的API控制器:

using System.Web.Http;
using Spyglass.Api.Entities;

namespace Spyglass.Api.Controllers {
    public class PeopleController : ApiController {

        public Person Get(string personId) {
            var member = new Person(personId) { FullName = "Eddie van Halen" };
            return (member);
        }
    }
}

我的路线配置:

using System.Web.Http;

namespace Spyglass.Api {
    public static class WebApiConfig {
        public static void Register(HttpConfiguration config) {
            config.Routes.MapHttpRoute(
                name: "PeopleApi",
                routeTemplate: "api/people/{personId}/{controller}/{id}",
                defaults: new {id = RouteParameter.Optional, controller = "People"}
                );
        }
    }
}

我的POCO:

namespace Spyglass.Api.Entities {
    public class Person {
        public string PersonId { get; set; }
        public string FullName { get; set; }

        public Person(string personId) {
            this.PersonId = personId;
        }
    }
}

我是否错过了POCO的某种自定义序列化配置?没有任何循环引用或复杂类型通常会导致XML序列化程序头痛...任何想法?

2 个答案:

答案 0 :(得分:6)

您需要使用[DataContract]和[DataMember]属性

来装饰对象
[DataContract]
public class Person
{

    [DataMember]
    public string PersonId { get; set; }

    [DataMember]
    public string FullName { get; set; }

    public Person(string id)
    {
        PersonId = id;
    }
}

或者,确保您的POCO具有默认的无参数构造函数。 这是DataContractSerializer的限制。您也可以使用其他序列化程序。

答案 1 :(得分:-2)

您可以尝试从global.asx.cs;

中删除json格式化程序
GlobalConfiguration.Configuration.Formatters.Remove(GlobalConfiguration.Configuration.Formatters.JsonFormatter);

这将只保留XML格式化程序。