当响应为HttpStatusCode.NoContent时,有什么方法可以获取HttpResponseMessage.Content主体?

时间:2019-11-20 14:37:26

标签: c# asp.net-core dotnet-httpclient

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

当前,当我向服务器发送GET请求并返回状态为 204 的响应时,看来System.Net.Http.HttpClient从其身上剥离了主体,我无法读取其内容。

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

我知道状态为204时服务器也将返回正文。我已经用Curl测试了它,并且它为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),它可以正常工作,我也可以读取正文。

有什么办法可以到达这个身体吗?

3 个答案:

答案 0 :(得分:1)

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

如果您确实必须处理损坏的HTTP服务器,则可以降至TCP级别并直接从套接字检索数据包,这似乎是解决问题的很长一段路要走。

答案 1 :(得分:0)

204表示没有内容,因此在阅读内容之前,请检查状态码。 如果要返回数据,请更改状态代码,因为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;

答案 2 :(得分:0)

看来我有点瞎了。事实是,根据HttpClient

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

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

  

204响应必须不包含消息正文,因此始终由标头字段之后的第一个空行终止。

相关问题