Serialization 为什么赢了';WebAPI是否以XML形式返回我的POCO?

Serialization 为什么赢了';WebAPI是否以XML形式返回我的POCO?,serialization,asp.net-web-api,poco,Serialization,Asp.net Web Api,Poco,WebAPI忽略了传入请求的Accept:头,似乎总是将我的POCO对象序列化为JSON。我正在使用测试API调用,并设置请求HTTP头: GET /api/people/evh123 Accept: application/xml 如果我修改我的控制器以返回string[]或其他一些本机类型,我将获得预期的XML。我看到一些人建议将这一行添加到我的应用程序\u Start()方法中: GlobalConfiguration.Configuration.Formatters.XmlFormat

WebAPI忽略了传入请求的Accept:头,似乎总是将我的POCO对象序列化为JSON。我正在使用测试API调用,并设置请求HTTP头:

GET /api/people/evh123
Accept: application/xml
如果我修改我的控制器以返回
string[]
或其他一些本机类型,我将获得预期的XML。我看到一些人建议将这一行添加到我的
应用程序\u 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序列化程序出现问题。。。有什么想法吗?

您可以尝试从global.asx.cs中删除json格式化程序

GlobalConfiguration.Configuration.Formatters.Remove(GlobalConfiguration.Configuration.Formatters.JsonFormatter);

这将只保留XML格式化程序完好无损。

您可以尝试从global.asx.cs中删除json格式化程序

GlobalConfiguration.Configuration.Formatters.Remove(GlobalConfiguration.Configuration.Formatters.JsonFormatter);

这将只保留XML格式化程序完好无损。

您需要使用[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的一个限制。您还可以使用不同的序列化程序。

您需要使用[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的一个限制。您也可以使用不同的序列化程序。

如果我添加该行,我会得到一个406不可接受的响应。您会看到一个406,因为在内容协商期间,每个格式化程序都会被询问是否可以写入特定类型。我认为XmlMediaTypeFormatter的CanWriteType提到的是false,因此您看到了这个问题。您可以通过执行类似“XmlMediaTypeFormatter frmtr=new XmlMediaTypeFormatter();bool canWriteType=frmtr.canWriteType(typeof(Person));”的操作来检查这一点,“如果我添加该行,我会得到一个406不可接受的响应。您看到的是406,因为在内容协商期间,每个格式化程序都会被询问是否可以写入特定类型。我认为XmlMediaTypeFormatter的CanWriteType提到的是false,因此您看到了这个问题。您可以通过执行类似“XmlMediaTypeFormatter frmtr=new XmlMediaTypeFormatter();bool canWriteType=frmtr.canWriteType(typeof(Person));”这样的操作来检查这一点,“Piotr是正确的,您需要添加一个默认值,无参数构造函数或添加DataContract/DataMember属性以使序列化程序正常工作。我在三年后加入,但这个问题刚刚发生在我身上。我很好地返回了JSON,但当我试图返回XML时,得到的只是一个空文档。装饰模型[DataContract]和[DataMember]解决了这个问题。Piotr在这方面是正确的,你要么需要添加一个默认的无参数构造函数,要么添加DataContract/DataMember属性来让序列化程序工作。我在三年后加入,但这个问题刚刚发生在我身上。我很好地返回了JSON,但当我试图返回XML时,得到的只是一个空文档。装饰模型[DataContract]和[DataMember]解决了它。下面的答案可能是正确的(即构造函数);然而,我想指出的是,这个答案涵盖了其他潜在问题,并为其他可能出现的问题提出了修复建议。下面的答案可能是正确的(即,构造器);然而,我想指出这个答案,它涵盖了其他潜在问题,并为可能出现的其他问题提出了修复建议