2016-08-16 6 views
5

У меня есть сценарий, где я должен позвонить Web API Удалить метод, построенный, как следующее:Передача содержимого тела при вызове метода Delete Web API с помощью System.Net.Http

// DELETE: api/products/{id}/headers 
[HttpDelete("{id}/headers")] 
public void DeleteProductHeaders(int id, [FromBody] string query) 
{ 
} 

Хитрость заключается в том, что в чтобы получить запрос, мне нужно отправить его через тело, а DeleteAsync не имеет параметра для json, как сообщение. Кто-нибудь знает, как я могу это сделать, используя клиент System.Net.Http в C#?

// Delete a product's headers 
public void DeleteProductHeaders(int id, string query) 
{ 
    using (var client = GetClient()) 
    { 
     HttpResponseMessage response; 
     try 
     { 
      // HTTP DELETE 
      response = client.DeleteAsync($"api/products/{id}/headers").Result; 
     } 
     catch (Exception ex) 
     { 
      throw new Exception("Unable to connect to the server", ex); 
     } 
    } 
    return retVal; 
} 
+1

Вы можете попробовать создать 'HttpRequestMessage' вручную с помощью метода DELETE и этапов' HttpContent' затем использовать 'HttpClient.SendAsync' – Nkosi

ответ

2

Я думаю, что причина HttpClient разработан таким образом является хотя HTTP 1.1 спецификации позволяет тело сообщения на DELETE запросов, по существу, не ожидается, сделать так, спецификация не определяет семантику для него, как это here. HttpClient строго следует спецификации HTTP, поэтому вы видите, что он не позволяет вам добавить тело сообщения в запрос.

Итак, я думаю, что ваш вариант с клиентской стороны включает использование HttpRequestMessage, описанного в here. Если вы хотите исправить это из бэкэнд и если ваше тело сообщения будет хорошо работать в параметрах запроса, вы можете попробовать это вместо отправки запроса в теле сообщения.

Я лично считаю, что DELETE должно быть разрешено иметь тело сообщения и не должно игнорироваться на сервере, так как есть определенные варианты использования для тех, которые вы упомянули здесь.

В любом случае для более продуктивного обсуждения этого вопроса, пожалуйста, взгляните на this.

2

Вот как я достиг его

var request = new HttpRequestMessage(HttpMethod.Delete, "http://www.example.com/"); 
request.Content = new StringContent(JsonConvert.SerializeObject(object), Encoding.UTF8, "application/json"); 
await this.client.SendAsync(request);