2015-11-09 9 views
13

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.

+2

Czy kiedykolwiek odkryłeś, co było nie tak? Mam do czynienia z tym samym problemem. – Zuhaib

+1

Niestety nie ... Zrobiłem pokój z tym błędem w WebApi i obejrzałem go ... – Igor

+0

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. –

Odpowiedz

-1

Musisz sprawdzić swoje żądanie "pobierz". Twoja prośba o uzyskanie musi być taka;

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

Nie musisz używać atrybutów DataContract i DataMember, aby to osiągnąć. Te atrybuty tylko dla innej rzeczy, nie jest to główny powód do użycia.

Po otrzymaniu trafnego trafienia na metodę get, w swojej metodzie możesz sprawdzić stan modelu;

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

Witaj orhun.begendi i dziękuję za pomoc. Niestety to nie jest problem. Żądanie przechodzi i "dostaję" je :) Problem polega na tym, że nazwa zdefiniowana w deskryptorze DataMember jest ignorowana. Spróbuj ponownie przeczytać cały opis :) – Igor

+0

Witam, spojrzałeś na ten artykuł? http://aspnetwebstack.codeplex.com/workitem/270 Jestem bardzo przydatny w tym temacie, dzięki czemu możesz wymusić użycie atrybutu datamember w żądaniu web api z tą konfiguracją, GlobalConfiguration.Configuration.Services.RemoveAll ( typeof (System.Web.Http.Validation.ModelValidatorProvider), v => v jest InvalidModelValidatorProvider); Mam nadzieję, że to się przyda. –

+0

Cześć, możesz spróbować zbudować własne powiązanie z modelem. odziedziczone po IModelBinder. Może być pomocne, możesz sprawdzić ten artykuł http://www.strathweb.com/2013/04/asp-net-web-api-parameter- binding-part-1- understanding- binding-from-uri/ –

Powiązane problemy