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

kry*_*our 1 c# rest json asp.net-web-api2

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

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

[Route("api/bob/user")]
[HttpPut]
public IHttpActionResult UpdateUser(User user)
Run Code Online (Sandbox Code Playgroud)

用户对象如下所示:

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; }
}
Run Code Online (Sandbox Code Playgroud)

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

{
   "user": {"Firstname":"Bob","Lastname":"Smith"}
}
Run Code Online (Sandbox Code Playgroud)

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

如果我将方法签名更改为对象,则获取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});
Run Code Online (Sandbox Code Playgroud)

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

内容类型显示

jan*_*ann 5

你不应该把user财产放在前面.您的JSON应如下所示:

{
   "Firstname": "Bob",
   "Lastname": "Smith"
}
Run Code Online (Sandbox Code Playgroud)

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

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

public class User {
   public User User { get; set; }  
}
Run Code Online (Sandbox Code Playgroud)

还要确保使用application/json内容类型.