我正在尝试编写一个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架构的一部分,但必须有一些方法来探索它使用的漂亮的序列化功能。
我哪里错了?
答案 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;