Tworzymy RestService z Asp.Net WebApi. Jednak z jakiegoś powodu właściwość Name
jest ignorowana w atrybucie DataMember
podczas próby deserializacji właściwości złożonej z atrybutem [FromURI]
.Właściwość DataMember's jest ignorowana przy użyciu właściwości [FromUri] w usłudze WebApi.
Na przykład możemy mieć: Metoda:
public IHttpActionResult Get([FromUri]User user)
Model:
[DataContract]
public class User
{
[DataMember(Name = "username")]
public string Username{ get; set; }
[DataMember(Name = "isActive", IsRequired = false)]
public bool? Active { get; set; }
}
Podczas deserializacji user
otrzymujemy login jak oczekiwano, ale null
dla Active
. Z drugiej strony podczas serializowania danych otrzymujemy zarówno isActive
jak i username
zgodnie z oczekiwaniami. Jeśli wyślemy żądanie z active
w ciągu zapytania, działa zgodnie z oczekiwaniami. Jest to oczywiście problem z IModelBinder
. Z jakiegoś powodu nie korzysta z właściwości DataMember
'Name
. Sprawdziłem co formaters są włączone i 4 domyślne te są rejestrowane:
System.Net.Http.Formatting.JsonMediaTypeFormatter
System.Net.Http.Formatting.XmlMediaTypeFormatter
System.Net.Http.Formatting.FormUrlEncodedMediaTypeFormatter
System.Net.Http.Formatting.JQueryMvcFormUrlEncodedFormatter
nie mam sposób sprawdzić, który z nich jest używany na życzenie. Zakładam, że jego FormUrlEncodedMediaTypeFormatter
, ale nie mogę być tego pewien. Ponadto, nie jestem pewien, czy to nawet obsługuje właściwość Name
.
Sprawdziłem już rozwiązanie i najbliższy temat, który mogłem znaleźć, to: WebAPI DataMember Name not used when de/serializing via application/x-www-form-urlencoded, ale nie używa on właściwości [FromUri]
, ale application/x-www-form-urlencoded
i nie został naprawiony.
Wszelkie pomysły, wskazówki i sugestie będą mile widziane.
Czy kiedykolwiek odkryłeś, co było nie tak? Mam do czynienia z tym samym problemem. – Zuhaib
Niestety nie ... Zrobiłem pokój z tym błędem w WebApi i obejrzałem go ... – Igor
Zostało to również zgłoszone tutaj https://forums.asp.net/t/2095416.aspx?Binding+FromUri+to+complex + obiekt + ignoruje + nazwę DataMember +. Jeśli chcesz użyć DataContract, zalecam zmianę z HttpGet na HttpPost. W przeciwnym razie musisz uporać się z błędem. Moje 2 centy. –