Posta JSON HttpContent in API Web ASP.NET

Dispongo di un’API Web ASP.NET ospitata e posso accedere alle richieste HTTP get in modo corretto, ora devo passare un paio di parametri a una richiesta PostAsync in questo modo:

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.

L’azione dell’API lato server si presenta così:

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

E solo per confermare il mio percorso sull’API Web assomiglia a questo:

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

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

    Il motivo per cui stai ricevendo un 404 è perché il framework non ha trovato un metodo da eseguire data la tua 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 un formattatore del tipo di supporto .

    Date queste regole, se vuoi associare il parametro al corpo POST, aggiungi semplicemente un attributo [FromBody] davanti al tipo:

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

    Per ulteriori informazioni , consultare la documentazione .