对象没有在使用web api的put请求中正确反序列化

时间:2015-11-04 12:10:01

标签: c# json rest asp.net-web-api2

我正在使用web-api 2和postman rest客户端进行测试。

我有一个方法定义,如下所示:

[Route("api/bob/user")]
[HttpPut]
public IHttpActionResult UpdateUser(User user)

用户对象如下所示:

public class User : IUser
{
    public string Firstname { get; set; }
    public string Lastname { get; set; }
}

public interface IUser
{
    string Firstname { get; set; }
    string Lastname { get; set; }
}

在邮递员中我设置了一个put请求并将内容类型设置为JSON(application / json)我在body中将以下内容指定为raw:

{
   "user": {"Firstname":"Bob","Lastname":"Smith"}
}

当我发送请求时,检测到对象类型但没有填充任何属性(它们都为空),这使我相信反序列化失败。

如果我将方法签名更改为对象,则获取json字符串并将其反序列化为用户对象。如果可能的话,我更喜欢强打字。

我的webapiconfig看起来像这样:

config.Formatters.JsonFormatter.SupportedMediaTypes.Add(
                                    new MediaTypeHeaderValue("text/html"));

config.MapHttpAttributeRoutes();

config.Routes.MapHttpRoute(
    name: "DefaultApi",
    routeTemplate: "api/{controller}/{id}/{action}",
    defaults: new {id = RouteParameter.Optional});

我还添加了测试客户端的屏幕截图:

content type shown

1 个答案:

答案 0 :(得分:5)

您之前不应该放置user属性。您的JSON应该如下所示:

{
   "Firstname": "Bob",
   "Lastname": "Smith"
}

为了使模型绑定器绑定到模型。

如果您希望使用当前的JSON,那么User模型应该是

public class User {
   public User User { get; set; }  
}

另外,请确保使用application/json作为内容类型。