DataMember';s Name属性被WebApi服务中的[FromUri]属性忽略
本文关键字:属性 FromUri 服务 WebApi Name DataMember | 更新日期: 2023-09-27 18:21:17
我们正在使用Asp.Net WebApi创建RestService。但由于某些原因,在尝试用[FromURI]
属性反序列化复杂属性时,DataMember
属性中忽略了Name
属性。
例如,我们可能有:方法:
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
时,我们得到了预期的username,但Active
得到了null
。另一方面,当串行化数据时,我们得到了预期的isActive
和username
。如果我们在查询字符串中发送带有active
的请求,它将按预期工作。
这显然是IModelBinder
的问题。由于某些原因,它没有使用DataMember
的Name
属性。我检查了包括哪些格式化程序,并注册了4个默认的格式化程序:
System.Net.Http.Formatting.JsonMediaTypeFormatter
System.Net.Http.Formatting.XmlMediaTypeFormatter
System.Net.Http.Formatting.FormUrlEncodedMediaTypeFormatter
System.Net.Http.Formatting.JQueryMvcFormUrlEncodedFormatter
我没有办法检查哪一个是应要求使用的。我认为它是FormUrlEncodedMediaTypeFormatter
,但我不能确定。此外,我不确定它是否支持Name
属性。
我已经检查了一个解决方案,我能找到的最接近的主题是通过application/x-www-form-urlencoded进行反序列化时没有使用WebAPI DataMember Name,但它没有使用[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)
{
//...
}
}
Will看起来像
public class User
{
[FromQuery(Name = "username")]
public string Username{ get; set; }
[FromQuery(Name = "isActive")]
public bool? Active { get; set; }
}
无论如何,最佳实践是在模型中保留名称,因为它在查询中参数化名称。在这种情况下,您不必提供";名称";参数,只保留queryClass上的[FromQuery]
,并自动提供小写.Net。
您必须检查您的"get"请求。你的get请求必须是这样的;
GET api/foo?username=fooname&active=false
您不需要DataContract和DataMember属性就可以实现这一点。这些属性只是为了另一件事,它不是使用的主要原因。
在get方法上获得有效命中后,可以在方法中检查modelstate;
if (ModelState.IsValid) {
/// your code goes here
}