加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-15 17:39:27 所属栏目:百科 来源:网络整理
导读:我们正在使用Asp.Net WebApi创建RestService.但是由于某些原因,在尝试使用[FromURI]属性反序列化复杂属性时,DataMember属性中的Name属性被忽略. 例如我们可能有: 方法: public IHttpActionResult Get([FromUri]User user) 模型: [DataContract]public cla
我们正在使用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; }
}

反序列化用户时,我们按预期获取用户名,但对于Active为null.另一方面,当序列化数据时,我们同时获得了isActive和用户名.如果我们发送查询字符串中的活动请求,它按预期工作.

这显然是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]但应用程序/ x-www-form-urlencoded属性,它没有真正解决.

任何想法,指点或建议将不胜感激.

解决方法

您必须检查您的“获取”请求.你的请求必须是这样的;
GET api/foo?username=fooname&active=false

您不需要DataContract和DataMember属性才能实现此目的.这些属性只是为了另一件事情,它不是使用的主要原因.

获得有效的get方法后,在你的方法,你可以检查modelstate像;

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读