gpt4 book ai didi

c# - WebApi 服务中的 [FromUri] 属性忽略了 DataMember 的 Name 属性

转载 作者:可可西里 更新时间:2023-11-01 08:13:46 25 4
gpt4 key购买 nike

我们正在使用 Asp.Net WebApi 创建 RestService。但由于某种原因,当尝试使用 [FromURI] 属性反序列化复杂属性时,Name 属性在 DataMember 属性中被忽略。

例如我们可能有:方法:

public IHttpActionResult Get([FromUri]User user)

型号:

[DataContract]
public class User
{
[DataMember(Name = "username")]
public string Username{ get; set; }
[DataMember(Name = "isActive", IsRequired = false)]
public bool? Active { get; set; }
}

反序列化 user 时,我们按预期获得用户名,但 nullActive。另一方面,当序列化数据时,我们得到了预期的 isActiveusername。如果我们在查询字符串中发送带有 active 的请求,它会按预期工作。

这显然是 IModelBinder 的问题。由于某些原因,它不使用 DataMemberName 属性。我检查了包含哪些格式器并注册了 4 个默认格式器:

System.Net.Http.Formatting.JsonMediaTypeFormatter
System.Net.Http.Formatting.XmlMediaTypeFormatter
System.Net.Http.Formatting.FormUrlEncodedMediaTypeFormatter
System.Net.Http.Formatting.JQueryMvcFormUrlEncodedFormatter

我没有办法检查根据要求使用了哪一个。我会假设它的 FormUrlEncodedMediaTypeFormatter 但我不能确定。另外,我不确定它是否支持 Name 属性。

我已经检查了一个解决方案,我能找到的最接近的主题是 WebAPI DataMember Name not used when de/serializing via application/x-www-form-urlencoded但它不使用 [FromUri]application/x-www-form-urlencoded 属性并没有真正解决。

如有任何想法、指示或建议,我们将不胜感激。

最佳答案

使用 [FromQuery] 代替其他属性。

和模型为您的要求http://localhost:8080/api/users?username=John&isActive=true

[Route("api/users")]
public class UsersController : Controller
{
[HttpGet]
public IHttpActionResult Get(User user)
{
//...
}
}

看起来像

public class User
{
[FromQuery(Name = "username")]
public string Username{ get; set; }
[FromQuery(Name = "isActive")]
public bool? Active { get; set; }
}

无论如何,最佳做法是将名称保留在模型中,因为它在查询中为名称提供参数。在这种情况下,您不必提供“Name”参数,只需将 [FromQuery] 保留在 queryClass 上,小写字母 .Net 会自动提供。

关于c# - WebApi 服务中的 [FromUri] 属性忽略了 DataMember 的 Name 属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33612106/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com