我们正在使用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
时,我们得到了预期的用户名,但是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
属性。
我已经寻找解决方案,并且最接近的主题是 WebAPI DataMember Name not used when de/serializing via application/x-www-form-urlencoded,但它不使用 [FromUri]
,而是用 application/x-www-form-urlencoded
属性,并且并没有真正解决问题。
任何想法、提示或建议将不胜感激。