我正在使用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),它可以正常工作,我也可以读取正文。
有什么办法可以到达这个身体吗?
答案 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响应必须不包含消息正文,因此始终由标头字段之后的第一个空行终止。