2017-08-21 3 views
1

Ich bin auf den Fluss von HTTP-Content-Negotiation verwendet, sondern etwas mit den folgenden deplaziert scheint:.NET WebAPI Parsen nicht [FromBody] richtig von Anforderungsinhalt

ich einen .NET WebAPI Controller mit dem folgende habe Inhalt:

/// <summary> 
    /// Search for Records corresponding to the given criterias 
    /// </summary> 
    [AcceptVerbs("POST")] 
    public async Task<IHttpActionResult> SearchRecord([FromBody]SearchPeopleModel recordSearchModel) 
    { 
     var recordService = Context.Services.Get<IRecordService>(); 
     var result = await recordService.SearchRecord(recordSearchModel); 
     return Jsonify(result); 
    } 

Mit Fiddler ist der Anforderungs-Inhalt wie folgt:

POST http://localhost:43465/api/Record/SearchRecord HTTP/1.1 
Host: localhost:43465 
Connection: keep-alive 
Content-Length: 72 
Pragma: no-cache 
Cache-Control: no-cache 
Accept: application/json 
Origin: (hidden) 
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 
(KHTML, like Gecko) Chrome/60.0.3112.101 Safari/537.36 
Content-Type: application/json 
Referer: http://localhost:43465/ 
Accept-Encoding: gzip, deflate, br 
Accept-Language: fr-FR,fr;q=0.8,en-US;q=0.6,en;q=0.4 
Cookie: ASP.NET_SessionId=(hidden) 

{"Any":"mat","Firstname":"","Lastname":"","Birthname":"","PatientId":""} 

das resultierende recordSearchModel NULL ist, wenn die WebAPI debuggen. Ich habe versucht, mit Body-Inhalt und JSON.stringify/not zu spielen und dies scheint auch nicht das Problem zu sein.

Ich muss etwas vermissen, aber ... Ich kann nicht sehen, wo! Hoffe jemand kann helfen!

EDIT: als Anfrage hier die searchPeopleModel Klasse. Ich werde die Implementierung von RecordService nicht zeigen, da es mit der Frage hier nichts zu tun hat.

public class SearchPeopleModel 
{ 
    public string Any {get; set;} 
    public string Firstname { get; set; } 
    public string Lastname { get; set; } 
    public string Birthname { get; set; } 
    public DateTime? BirthDate { get; set; } 
    public Guid? PatientId { get; set; } 
} 

Einige Präzision, wie ich unklar gewesen sein mag: die recordSearchModel null ist, wenn ASP.NET Web API die Anforderung empfängt, der Rest des Codes wirkt perfekt wie beabsichtigt.

+0

Können Sie den RecordService-Code angeben. –

+0

gleiche mit verschiedenen Modell-Klasse, Code ist funktioniert für mich. –

+0

können Sie die SearchPeopleModel-Klasse anzeigen? –

Antwort

0

Ich grabe endlich aus.

Es erscheint der Parameter

public Guid? PatientId { get; set; } 

Von SearchPeopleModel können standardmäßig nicht von asp.net WebAPI deserialisiert werden. Für ein solches Verhalten zu arbeiten, wir senden müssen:

{"Any":"mat","Firstname":"","Lastname":"","Birthname":""} 

Statt:

{"Any":"mat","Firstname":"","Lastname":"","Birthname":"","PatientId":""} 

Ursache: "" kann Guid nicht bu in eine gültige Null gedreht. "[some-valid-guid]" funktioniert jedoch.

Ich hoffe, es kann jemandem helfen.