使用WebApi服务中的[FromUri]属性忽略DataMember的Name属性

时间:2015-11-09 15:08:51

标签: c# rest asp.net-web-api2 datamember

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

例如我们可能有: 方法:

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。另一方面,在序列化数据时,我们会按预期获得isActiveusername。如果我们在查询字符串中发送带active的请求,则按预期工作。

这显然是IModelBinder的问题。由于某种原因,它不使用DataMember的{​​{1}}属性。我检查了包含哪些格式化程序,并注册了4个默认格式化程序:

Name

我无法检查请求使用哪一个。我会假设它System.Net.Http.Formatting.JsonMediaTypeFormatter System.Net.Http.Formatting.XmlMediaTypeFormatter System.Net.Http.Formatting.FormUrlEncodedMediaTypeFormatter System.Net.Http.Formatting.JQueryMvcFormUrlEncodedFormatter ,但我无法确定。此外,我不确定它是否支持FormUrlEncodedMediaTypeFormatter属性。

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

任何想法,指示或建议都会非常感激。

1 个答案:

答案 0 :(得分:-1)

你必须检查你的"得到"请求。您的获取请求必须是这样的;

GET api/foo?username=fooname&active=false

您不必使用DataContract和DataMember属性来实现此目的。这些属性仅用于另一件事,它不是用于的主要原因。

在获取get方法的有效命中后,在您的方法中,您可以检查modelstate,如;

if (ModelState.IsValid) {
/// your code goes here    
}