纠正Web api路由设置以反序列化POST内容

时间:2014-12-05 10:18:46

标签: 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 = 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);
    }
}

现在,在这个例子中,web api很好地反序列化post数据包的内容并将其放入传入参数 book 。我该如何使用它?我有以下代码:

[HttpPost]
public HttpResponseMessage RequestMarkAdjustment([FromBody] MarkAdjustment value)
    {
        //work with the mark object
    }

我的帖子包中有所有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>

我的请求网址如下所示:

http://localhost:3485/api/Person/RequestMarkAdjustment/123456
User-Agent: Fiddler
Host: localhost:3485
Content-Length: 448

路由总是通过方法,但标记对象是 null 我是否必须更改路由中的某些内容?我看到工作示例是RESTful架构的一部分,但必须有一些方法来探索它使用的漂亮的序列化功能。

我哪里错了?

1 个答案:

答案 0 :(得分:1)

根据您的HTTP请求的标头,您似乎省略了Content-Type。 您必须将Content-Type设置为 application / xml 才能告诉模型活页夹应该使用哪种Media-Type Formatter。

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

[DataContract(Namespace = "")]
public class MarkAdjustment
{
  ...
}

如果您愿意,可以将XmlMediaTypeFormatter配置为使用 XmlSerializer 而不是DataContractSerializer。为此,请将UseXmlSerializer属性设置为true:

在WebApiConfig的Register方法中:

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