当响应为 HttpStatusCode.NoContent 时,有什么方法可以得到 HttpResponseMessage.Content body?

Is there any way how to get HttpResponseMessage.Content body when response is HttpStatusCode.NoContent?

我正在使用 C# 和 .NET Core 3.0

目前,当我向服务器发送 GET 请求并且它 returns 响应状态为 204 时,似乎 System.Net.Http.HttpClient 删除了 body,我无法阅读其内容。

var request = new HttpRequestMessage(HttpMethod.Get,$"/gettask.ashx?testerror=20");
var response = await _httpClient.SendAsync(request);
var responseContent = await response.Content.ReadAsStringAsync();

我知道当状态为 204 时,服务器也会返回 body。我已经用 Curl 测试了它,它 returns 这个 body 用于 204 { "nextRequestInSec" : 10 }

来自 curl 的详细响应:

curl http://address.dom/testerror=204 -v
*   Trying xxx.xxx.xxx.xxx...
* TCP_NODELAY set
* Connected to address.dom (xxx.xxx.xxx.xxx) port 80 (#0)
> GET testerror=204 HTTP/1.1
> Host: address.dom
> User-Agent: curl/7.55.1
> Accept: */*
>
< HTTP/1.1 204 No Content
< Cache-Control: private
< Transfer-Encoding: chunked
< Content-Type: text/html; charset=utf-8
< Server: Microsoft-IIS/8.5
< X-AspNet-Version: 4.0.30319
< X-Powered-By: ASP.NET
< Date: Wed, 20 Nov 2019 13:45:00 GMT
<
{ "nextRequestInSec" : 10 }* Connection #0 to host address.dom left intact

对于其他回复(200、401、403、404、420、500),它工作正常,我也可以阅读 body。

有什么方法可以到达这个 body?

204表示没有内容,所以在阅读内容之前检查状态码。 如果你想要 return 数据,请更改你的状态代码,因为 204 不应该。

var request = new HttpRequestMessage(HttpMethod.Get,$"/gettask.ashx?testerror=20");
var response = await _httpClient.SendAsync(request);
var responseContent = (response.IsSuccessStatusCode && response.StatusCode !=204)? await 
                      response.Content.ReadAsStringAsync():null;

正如@peinarydevelopment 在他们的评论中提到的那样,httpclient 实例不会 return 不支持状态代码的主体。解决您的问题的最佳方法是修复服务器(或询问负责它的人)。

如果你真的必须处理损坏的 HTTP 服务器,你可以下降到 TCP 级别并直接从套接字检索数据包,这似乎是一个很长的解决问题的方法。

嗯,看来我有点蒙了。事实上,根据 HttpClient

,在 .NET Core 中 这是不可能的

此外,如果您将其视为 HTTP 通信,它应该遵循 HTTP specification,即:

The 204 response MUST NOT include a message-body, and thus is always terminated by the first empty line after the header fields.