Skip to main content
 首页 » 编程设计

c#之对象在使用 web api 发出请求时未正确反序列化

2024年01月31日25kevingrace

我正在使用 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; } 
} 

在 postman 中,我设置了一个放置请求并将内容类型设置为 JSON(application/json) 我在正文中将以下内容指定为原始:

{ 
   "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}); 

我还附上了测试客户端的截图:

请您参考如下方法:

你不应该把 user 属性放在前面。您的 JSON 应如下所示:

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

为了让模型绑定(bind)器绑定(bind)到模型。

如果您希望使用当前的 JSON,您的 User 模型应该如下所示

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

还要确保使用 application/json 作为内容类型。