【问题标题】:DataMember Name not respected when using WebApi使用 WebApi 时不尊重 DataMember 名称
【发布时间】:2017-06-15 23:16:57
【问题描述】:

我在 WebApi2 服务中使用了以下类。

[DataContract()]
public class TokenRequest
{
    [Required]
    [DataMember(Name = "last_name")]
    public String LastName { get; set; }

    [Required]
    [DataMember(Name = "badge_number")]
    public String BadgeNumber { get; set; }
}

如您所见,该类的属性别名为 [DataMember(Name = "...")]

使用以下控制器

[Route("Service/GetToken")]
[HttpPost]
public IHttpActionResult GetToken(TokenRequest request) { ... }

我曾希望获得一个带有以下 POST 正文的 TokenRequest 对象

last_name=Stillwell&badge_number=0000

但是,request.LastNamerequest.BadgeNumber 都为空。

现在,如果我这样提出请求:

LastName=Stillwell&BadgeNumber=0000

request.LastNamerequest.BadgeNumber 将具有正确的值。当我使用 last_namebadge_number 时,为什么 [DataMember(Name = "...")] 没有引入我的值?

【问题讨论】:

  • @Dayan,我是。因此控制器上的[HttpPost] 属性。
  • 没有看到更多很难说,但我的猜测是应用程序正在使用 Newtonsoft 库来处理它的 JSON 对象的反序列化,在这种情况下你会想要使用 JsonProperty 属性,例如 TokenRequest 类的 LastName 属性上的[JsonProperty("last_name")]
  • @peinearydevelopment 以前(现已删除)的答案表明了这一点。然而,结果是一样的。我从请求中收到了空值。
  • 您是否尝试过使用这样的 POST 正文:{"last_name":"Stillwell","badge_number"="000"}

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


【解决方案1】:

我可以通过在 Controller 中返回 TokenRequest 来解决此问题。

[Route("Service/GetToken")]
[HttpPost]
public TokenRequest GetToken(TokenRequest request) { ... }

然后,在我的 WebApiConfig.cs 文件中,我添加了以下内容

var appXmlType = config.Formatters.XmlFormatter.SupportedMediaTypes.FirstOrDefault(t => t.MediaType == "application/xml");
config.Formatters.XmlFormatter.SupportedMediaTypes.Remove(appXmlType);

这将返回 JSON 而不是 XML。见:How do I get ASP.NET Web API to return JSON instead of XML using Chrome?

【讨论】:

    猜你喜欢
    • 2015-07-07
    • 1970-01-01
    • 1970-01-01
    • 2018-03-22
    • 2017-03-27
    • 2014-01-20
    • 1970-01-01
    • 2016-01-07
    • 2018-05-28
    相关资源
    最近更新 更多