使用System.Net.Http调用Delete Web API方法时传递正文内容

Bla*_*ell 7 c# http asp.net-web-api system.net.httpwebrequest

我有一个场景,我需要调用我的Web API Delete方法,如下所示:

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

诀窍是,为了获得查询,我需要通过正文发送它,而DeleteAsync没有像post那样的json参数.有谁知道如何使用c#中的System.Net.Http客户端来做到这一点?

// 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;
}
Run Code Online (Sandbox Code Playgroud)

Ben*_*son 15

这就是我完成它的方式

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);
Run Code Online (Sandbox Code Playgroud)


Swa*_*eek 4

HttpClient 如此设计的原因源于 HTTP 1.1 规范。虽然规范在技术上允许DELETE请求上的消息正文,但这是一种非常规做法,并且规范没有提供此处定义的明确语义。HttpClient 严格遵守 HTTP 规范,这意味着它不支持向 DELETE 请求添加消息正文。

因此,当尝试在 DELETE 请求中包含消息正文时,您可能会发现限制,这可以通过实际场景进行演示。如果您遇到此限制并且需要发送通常放置在消息正文中的数据,您可以考虑其他方法,例如使用此处描述的 HttpRequestMessage 。

从我个人的角度来看,我认为 DELETE 应该允许消息正文并且不会被服务器忽略,因为确实存在用例,例如您在这里提到的用例。

有关此主题的更全面的讨论,请参阅此资源

编辑:只需使用 VsCode 的 ThunderClient Extension 或 Postman(而不是 Visual Studios app.http 文件)即可使用 Body 调用 DELETE api。