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。另一方面,当串行化数据时,我们得到了预期的isActiveusername。如果我们在查询字符串中发送带有active的请求,它将按预期工作。

这显然是IModelBinder的问题。由于某些原因,它没有使用DataMemberName属性。我检查了包括哪些格式化程序,并注册了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属性,并且没有真正解决。

任何想法、建议或建议都将不胜感激。

DataMember';s Name属性被WebApi服务中的[FromUri]属性忽略

使用[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    
}