2014-06-08 8 views
12

Ho un Web API ASP.NET ospitato e può accedere a richieste HTTP GET bene, ora ho bisogno di passare un paio di parametri ad una richiesta PostAsync in questo modo:Messaggio JSON HttpContent ad ASP.NET Web API

var param = Newtonsoft.Json.JsonConvert.SerializeObject(new { id=_id, code = _code }); 
HttpContent contentPost = new StringContent(param, Encoding.UTF8, "application/json"); 

var response = client.PostAsync(string.Format("api/inventory/getinventorybylocationidandcode"), contentPost).Result; 

Questa chiamata restituisce un risultato 404 non trovato.

Il lato server API azione assomiglia così:

[HttpPost] 
public List<ItemInLocationModel> GetInventoryByLocationIDAndCode(int id, string code) { 
... 
} 

E proprio per confermare la mia rotta sulla API Web assomiglia a questo:

config.Routes.MapHttpRoute(
      name: "DefaultApiWithAction", 
      routeTemplate: "api/{controller}/{action}/{id}", 
      defaults: new { id = RouteParameter.Optional } 
); 

Presumo che sto passando il JSON HttpContent in modo errato, perché questo dovrebbe restituire lo stato 404?

risposta

5

Il motivo per cui si sta ricevendo un 404 è perché il framework non ha trovato un metodo da eseguire in base alla richiesta. Per impostazione predefinita, l'API Web utilizza le seguenti regole per associare parametri nei metodi:

  • Se il parametro è di tipo "semplice", l'API Web tenta di ottenere il valore dall'URI. I tipi semplici includono i tipi primitivi .NET (int, bool, double e così via), oltre a TimeSpan, DateTime, Guid, decimal e string, più qualsiasi tipo con un convertitore di tipi che può convertire da una stringa. (Ulteriori informazioni sui convertitori di tipi in seguito.)
  • Per i tipi complessi, l'API Web tenta di leggere il valore dal corpo del messaggio, utilizzando uno media-type formatter.

A fronte di tali norme, se si vuole associare il parametro dal corpo POST è sufficiente aggiungere un attributo [FromBody] davanti al tipo:

[HttpPost] 
public List<ItemInLocationModel> GetInventoryByLocationIDAndCode([FromBody] int id, string code) { 
... 
} 

Per ulteriori informazioni please see the documentation.