Asp.net mvc 4 用于反序列化帖子内容的正确webapi路由设置

Asp.net mvc 4 用于反序列化帖子内容的正确webapi路由设置,asp.net-mvc-4,asp.net-web-api,xml-deserialization,Asp.net Mvc 4,Asp.net Web Api,Xml Deserialization,我正在尝试编写一个webapi方法,用于读取POST消息内容并将其自动转换为对象。我知道mvc中必须有底层功能才能做到这一点,正如您从本例中看到的: public HttpResponseMessage Put(int id, Book value) { try { using (SampleDbEntities entities = new SampleDbEntities()) { Book foundBook = e

我正在尝试编写一个webapi方法,用于读取POST消息内容并将其自动转换为对象。我知道mvc中必须有底层功能才能做到这一点,正如您从本例中看到的:

public HttpResponseMessage Put(int id, Book value)

{
    try
    {
        using (SampleDbEntities entities = new SampleDbEntities())
        {
            Book foundBook = entities.Books.SingleOrDefault<book>(b => b.ID == id);
            foundBook.BookName = value.BookName;
            entities.SaveChanges();
            return Request.CreateResponse(HttpStatusCode.OK);
        }
    }
    catch (Exception ex)
    {
        return Request.CreateResponse(HttpStatusCode.InternalServerError, ex.Message);
    }
}
我的post数据包中包含了所有xml:

<MarkAdjustment>
<PersonNo>123456</PersonNo>
<Date>2014-12-03T09:25:15</Date>
<StartPeriod>1</StartPeriod>
<EndPeriod>2</EndPeriod>
<ClassCode>CL883A</ClassCode>
<Reason>Some Reason</Reason>
</MarkAdjustment>
路由始终通过方法,但标记对象为空。我是否必须更改路由中的某些内容?我看到工作示例是RESTful体系结构的一部分,但必须有某种方法来深入研究它使用的良好的反序列化功能


哪里出错了?

根据HTTP请求的标题,您似乎忽略了
内容类型。
您必须将
内容类型
设置为应用程序/xml,以便告诉模型绑定器应该使用哪种媒体类型格式化程序

此外,默认情况下,XmlMediaTypeFormatter使用DataContractSerializer类执行序列化。由于XML示例中未设置任何名称空间,因此应在模型上使用DataContractAttribute,如下所示:

[DataContract(Namespace = "")]
public class MarkAdjustment
{
  ...
}
如果愿意,可以将XmlMediaTypeFormatter配置为使用XmlSerializer而不是DataContractSerializer。为此,请将UseXmlSerializer属性设置为true:

在WebApiConfig的注册方法中:

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

为什么要将id作为POST中的参数?如果您知道资源的位置,它应该是PUT。否则,您的方法应该类似于public HttpResponseMessage RequestMarkAdjustment([FromBody]MarkAdjustment mark);干杯,马丁。更新代码以删除id参数并添加[FromBody]属性。它仍然是空的。此函数作为额外的辅助函数存在于my person controller中。它必须是一个基本的crud操作吗?而且MarkAdjustment对象为null时仍然存在相同的问题?是的,仍然存在问题现在您已经从操作中删除了Id参数,您应该从Url中删除它,这样您也可以调用,正如Thibault在下面所说的,没有提到您的内容类型,您需要将标题设置为chap!非常感谢你!
[DataContract(Namespace = "")]
public class MarkAdjustment
{
  ...
}
var xml = GlobalConfiguration.Configuration.Formatters.XmlFormatter;
xml.UseXmlSerializer = true;