2016-02-11 30 views
13

Sto tentando di eseguire il POST su un'API Web utilizzando HttpClient. Quando inserisco un breakpoint nel metodo Save dell'API Web, il prodotto [FromBody] è nullo. Ciò significa che c'è qualcosa di sbagliato nel modo in cui sto postando il prodotto sull'API Web. Qualcuno può dare un'occhiata al codice qui sotto e vedere dove potrei sbagliare. Presumo che si tratti di intestazioni e tipi di contenuto.Registrare su un'API Web utilizzando il metodo HttpClient e il metodo API Web [FromBody] termina con l'essere nullo

chiamata POST da un repository client al Web API che dovrebbe passare il prodotto oggetto attraverso come JSON:

public async Task<Product> SaveProduct(Product product) 
{ 
    using (var client = new HttpClient()) 
    { 
     client.BaseAddress = new Uri("http://localhost:99999/"); 
     client.DefaultRequestHeaders.Accept.Clear(); 
     client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); 

     StringContent content = new StringContent(JsonConvert.SerializeObject(product)); 
     // HTTP POST 
     HttpResponseMessage response = await client.PostAsync("api/products/save", content); 
     if (response.IsSuccessStatusCode) 
     { 
      string data = await response.Content.ReadAsStringAsync(); 
      product = JsonConvert.DeserializeObject<Product>(data); 
     } 
    } 
    return product; 
} 

Web API Metodo di controllo:

[HttpPost] 
[Route("save")] 
public IActionResult Save([FromBody]Product product) 
{ 
    if (customer == null) 
    { 
     return HttpBadRequest(); 
    } 
    _manager.SaveCustomer(product); 
    return CreatedAtRoute("Get", new { controller = "Product", id = product.Id }, product); 
} 

[FromBody] Il parametro del prodotto del prodotto finisce per essere nullo.

+0

Raccomando di non avvolgere HttpClient in un'istruzione using vedere https://aspnetmonsters.com/2016/08/2016-08-27-httpclientwrong/ – Xander

risposta

22

Hai provato a controllare la richiesta in qualcosa come Fiddler? Ha bisogno che il tipo di contenuto sia application/json come hai sottolineato. Ma stai solo impostando l'intestazione di accettazione.

Prova:

StringContent content = new StringContent(JsonConvert.SerializeObject(product), Encoding.UTF8, "application/json");