如何将Web API 2 HttpRequestMessage序列化到我的自定义对象中

时间:2014-04-20 22:17:33

标签: c# asp.net-web-api

我的WebAPI 2项目中有以下方法。

public class TestController : ApiController
{
    [HttpPost]
    public void Test(HttpRequestMessage request)
    {
        var content = request.Content;
        string jsonContent = content.ReadAsStringAsync().Result;
    }
}

我的自定义对象看起来像这样;

public class Test
{
    public int Id { get; set; }
    public string Name { get; set; }
}

如果我发布一些样本数据,如

<Test>
    <Id>12345</Id>
    <Name>My Name</Name>
</Test>

jsonContent中的结果值是正确的。我的问题是我应该如何最好地将HttpRequestMessage(内容)序列化到我的对象Test中,以便我可以执行其他验证/任务等。

我应该将HttpRequestMessage传递给方法还是可以传递类似

的内容
public void Test(Test oTest)

2 个答案:

答案 0 :(得分:6)

听起来你正在问如何将jsonContent反序列化为Test类的新实例,正如上面提到的第一条评论。我建议调查一下Json.NET。然后你可以做类似的事情:

public class TestController : ApiController
{
  [HttpPost]
  public void Test(HttpRequestMessage request)
  {
    var content = request.Content;
    string jsonContent = content.ReadAsStringAsync().Result;
    Test test = new Test();
    test = JsonConvert.DeserializeObject<Test>(jsonContent);
    //Do validation stuff...
  }
}

答案 1 :(得分:1)

您可以在动作方法中使用这样的参数。

[HttpPost]
public void Test(Test oTest)

ASP.NET Web API会将请求消息正文(JSON或XML)反序列化为Test。根据请求中的内容类型标头,Web API可以处理开箱即用的JSON和XML内容。对于XML,Web API默认使用DCS。您在帖子中显示的XML不会按原样反序列化。尝试返回一个Test对象,看看它是如何通过Web API序列化的,并在POST请求中使用相同的XML来使绑定正常工作。

顺便说一句,如果在操作方法中使用Test参数,Web API将使用请求正文流。所以,你将无法在动作方法中阅读它,就像你正在做的那样。