Igo*_*gor 13 c# rest datamember asp.net-web-api2
我们正在使用Asp.Net WebApi创建RestService.但由于某些原因Name,DataMember在尝试使用[FromURI]属性反序列化复杂属性时,属性会在属性中被忽略.
例如,我们可能有:方法:
public IHttpActionResult Get([FromUri]User user)
Run Code Online (Sandbox Code Playgroud)
模型:
[DataContract]
public class User
{
[DataMember(Name = "username")]
public string Username{ get; set; }
[DataMember(Name = "isActive", IsRequired = false)]
public bool? Active { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
反序列化时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
Run Code Online (Sandbox Code Playgroud)
我无法检查请求使用哪一个.我会假设它,FormUrlEncodedMediaTypeFormatter但我无法确定.此外,我不确定它是否支持Name财产.
我已经检查了一个解决方案,我能找到的最接近的主题是WebAPI DataMember名称在通过application/x-www-form-urlencoded进行de/serial化时没有使用,但它不使用[FromUri]但application/x-www-form-urlencoded属性并没有真正解决.
任何想法,指针或建议将不胜感激.
您必须检查您的“获取”请求。你的 get 请求必须是这样的;
GET api/foo?username=fooname&active=false
Run Code Online (Sandbox Code Playgroud)
您不必使用 DataContract 和 DataMember 属性来实现此目的。这些属性只是为了另一件事,并不是使用的主要原因。
在您的 get 方法获得有效命中后,在您的方法中您可以检查模型状态,例如;
if (ModelState.IsValid) {
/// your code goes here
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
850 次 |
| 最近记录: |