2015-11-09 10 views
13

Wir erstellen RestService mit Asp.Net WebApi. Aber aus irgendeinem Grund Name Eigenschaft wird ignoriert in DataMember Attribut beim Versuch, komplexe Eigenschaft mit [FromURI] Attribut zu deserialisieren.Die Name-Eigenschaft von DataMember wird mit der Eigenschaft [FromUri] im WebApi-Service ignoriert

Zum Beispiel könnten wir haben: Methode:

public IHttpActionResult Get([FromUri]User user) 

Modell:

[DataContract] 
public class User 
{ 
    [DataMember(Name = "username")] 
    public string Username{ get; set; } 
    [DataMember(Name = "isActive", IsRequired = false)] 
    public bool? Active { get; set; } 
} 

Wenn user wir Benutzernamen erhalten Deserialisieren wie erwartet, aber null für Active. Auf der anderen Seite erhalten wir beim Serialisieren von Daten sowohl isActive als auch username wie erwartet. Wenn wir eine Anfrage mit active in der Abfragezeichenfolge senden, funktioniert es wie erwartet.

Es ist offensichtlich Problem mit . Es verwendet DataMember 's Name Eigenschaft aus irgendeinem Grund nicht. Ich habe, was formaters sind enthalten und 4 auch keine registriert sind:

System.Net.Http.Formatting.JsonMediaTypeFormatter 
System.Net.Http.Formatting.XmlMediaTypeFormatter 
System.Net.Http.Formatting.FormUrlEncodedMediaTypeFormatter 
System.Net.Http.Formatting.JQueryMvcFormUrlEncodedFormatter 

Ich habe keine Möglichkeit haben, zu überprüfen, welche auf Anfrage verwendet wird. Ich würde davon ausgehen, dass es FormUrlEncodedMediaTypeFormatter aber ich kann mir nicht sicher sein. Außerdem bin ich mir nicht sicher, ob es überhaupt Name Eigenschaft unterstützt.

Ich habe bereits nach einer Lösung überprüft und das nächste Thema, das ich finden konnte, war WebAPI DataMember Name not used when de/serializing via application/x-www-form-urlencoded, aber es verwendet nicht [FromUri] sondern application/x-www-form-urlencoded Eigentum und es wurde nicht wirklich gelöst.

Alle Ideen, Hinweise oder Vorschläge würden sehr geschätzt werden.

+2

Haben Sie jemals herausgefunden, was los war? Ich stehe vor demselben Problem. – Zuhaib

+1

Leider nicht ... Ich habe mit WebAci Frieden geschlossen und habe damit gearbeitet ... – Igor

+0

Dies wurde auch hier berichtet https://forums.asp.net/t/2095416.aspx?Binding+FromUri+to+complex + Objekt + ignoriert + DataMember + Name. Wenn Sie DataContract verwenden möchten, empfehle ich, von HttpGet zu HttpPost zu wechseln. Andernfalls müssen Sie sich mit dem Fehler befassen. Meine 2 Cent. –

Antwort

-1

Sie müssen Ihre "erhalten" Anfrage überprüfen. Ihre Anfrage muss so sein;

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

Sie müssen nicht DataContract und DataMember-Attribut, nur um dies zu erreichen. Diese Attribute nur für eine andere Sache, es ist nicht der Hauptgrund dafür zu verwenden.

Nach erhalten gültigen Treffer auf Ihre Methode erhalten, können Sie in Ihrer Methode modelstate like;

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

Hallo orhun.begendi und danke, dass du versucht hast zu helfen. Leider ist das kein Problem. Die Anfrage geht durch und ich "bekomme" es :) Das Problem liegt darin, dass der im DataMember-Deskriptor definierte Name ignoriert wird. Versuchen Sie, die ganze Beschreibung erneut zu lesen :) – Igor

+0

Hallo, haben Sie diesen Artikel angesehen? http://aspnetwebstack.codeplex.com/workitem/270 Ich finde ziemlich nützlich zu diesem Thema, mit diesem können Sie zwingen, Datenemember Attribut in Web-API-Anfrage mit dieser Konfiguration, GlobalConfiguration.Configuration.Services.RemoveAll ( typeof (System.Web.Http.Validierung.ModelValidatorProvider), v => v ist InvalidModelValidatorProvider); Ich hoffe es ist nützlich. –

+0

hallo wieder, Sie können versuchen, Ihre eigene Modellbindung vielleicht bauen. von IModelBinder geerbt. Könnte hilfreich sein, können Sie diesen Artikel überprüfen http://www.strathweb.com/2013/04/asp-net-web-api-parameter-binding-part-1-understanding-binding-from-uri/ –