Подтвердить что ты не робот

Свойство DataMember Name игнорируется с помощью свойства [FromUri] в службе WebApi

Мы создаем RestService с Asp.Net WebApi. Но по какой-то причине свойство 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. С другой стороны, при сериализации данных мы получаем как 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, которое не используется при де-сериализации через application/x-www-form-urlencoded, но он не использует свойство [FromURI], но application/x-www-form-urlencoded, и он не был действительно решен.

Любые идеи, указатели или предложения будут высоко оценены.

4b9b3361

Ответ 1

Вы должны проверить свой запрос "получить". Ваш запрос на получение должен быть таким:

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

Для этого не требуется атрибут DataContract и DataMember. Эти атрибуты только для другой вещи, это не главная причина для использования.

После получения действительного нажатия на ваш метод get, в вашем методе вы можете проверить модельное состояние, например:

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