【发布时间】:2016-02-10 06:35:48
【问题描述】:
我们正在使用 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 时,我们得到了预期的用户名,但null 得到Active。另一方面,在序列化数据时,我们得到了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 属性,它并没有真正解决。
任何想法、指示或建议将不胜感激。
【问题讨论】:
-
你有没有发现,出了什么问题?我也面临同样的问题。
-
不幸的是没有...我在 WebApi 中解决了这个错误并解决了它...
-
这也被报告在这里forums.asp.net/t/…。如果您想使用 DataContract,那么我建议您从 HttpGet 更改为 HttpPost。否则,您将需要处理该错误。我的 2 美分。
-
您能说明如何以 JSON 格式发送对象吗?
-
Heya @jaroslaw,这个问题已有 5 年历史,因此有点过时了,不确定它在当今时代是否仍然相关......如果你有一个特别相关的问题,我建议您在 SO 上打开一个单独的问题。
标签: c# rest asp.net-web-api2 datamember