c# JSON 通过 3 种不同方法(WebRequest、RESTSharp、HttpClient)的 REST 响应为空,但 Postman 和浏览器有效
c# JSON REST response via 3 different approaches (WebRequest, RESTSharp, HttpClient) is empty, but Postman and browser works
在 C# 中调用在 Postman(或通过 Firefox)中没有问题的特定端点时,我得到一个空响应。
我正在呼叫的 url 正在返回一组数据。在 url 参数中,我可以指定我想要多少所述数据。
我已经检查了 Postman 中的响应大小,当我限制 C# 调用中请求的数据量以使响应大约为 700kb 时,我会收到 JSON 响应。
但是,如果我在 C# 调用中超过此大小,则响应为空“{ }”并且返回的 ContentLength = -1(返回的 statusCode 为 200,所以这至少看起来不错)。在 C# 中失败的相同请求在 Postman 和 Firefox 中工作正常但是...
我怀疑发生这种情况是因为反序列化器的缓冲区不够大,或者因为响应仍在传输中并且代码在读取整个响应主体之前以某种方式继续执行...
下面是我测试过的 3 个实现:
1:
var httpClient = new HttpClient();
var responseMessage = await httpClient.GetAsync(requestUrl, HttpCompletionOption.ResponseHeadersRead);
if (responseMessage.StatusCode == System.Net.HttpStatusCode.OK)
{
using (var httpStream = await responseMessage.Content.ReadAsStreamAsync())
{
using (var sr = new StreamReader(httpStream))
{
Info(await sr.ReadToEndAsync()); //Info logs the string to a file
}
}
}
2(RESTSharp):
var client = new RestClient();
var request = new RestRequest(requestUrl, Method.GET, DataFormat.Json);
Info(request.Content); //Info logs the string to a file
3:
var httpWebRequest = (HttpWebRequest)WebRequest.Create(requestUrl);
httpWebRequest.ContentType = "application/json; charset-utf8";
var httpWebResponse = httpWebRequest.GetResponse() as HttpWebResponse;
var binReader = new BinaryReader(responseStream);
const int bufferSize = 4096;
byte[] responseBytes;
using (MemoryStream ms = new MemoryStream())
{
byte[] buffer = new byte[bufferSize];
int count;
while ((count = binReader.Read(buffer, 0, buffer.Length)) != 0)
{
ms.Write(buffer, 0, count);
}
responseBytes = ms.ToArray();
}
Info(Encoding.UTF8.GetString(responseBytes, 0, responseBytes.Length)); //Info logs the string to a file
我没有修改 HttpClient.MaxResponseContentBufferSize 属性,但为了更好的衡量,我也尝试更改此值,但无济于事。
我该如何解决这个问题?
我发现了问题,这是由我连接的后端服务引起的。再次感谢@Panagiotis Kanavos
在 C# 中调用在 Postman(或通过 Firefox)中没有问题的特定端点时,我得到一个空响应。
我正在呼叫的 url 正在返回一组数据。在 url 参数中,我可以指定我想要多少所述数据。 我已经检查了 Postman 中的响应大小,当我限制 C# 调用中请求的数据量以使响应大约为 700kb 时,我会收到 JSON 响应。
但是,如果我在 C# 调用中超过此大小,则响应为空“{ }”并且返回的 ContentLength = -1(返回的 statusCode 为 200,所以这至少看起来不错)。在 C# 中失败的相同请求在 Postman 和 Firefox 中工作正常但是...
我怀疑发生这种情况是因为反序列化器的缓冲区不够大,或者因为响应仍在传输中并且代码在读取整个响应主体之前以某种方式继续执行...
下面是我测试过的 3 个实现:
1:
var httpClient = new HttpClient();
var responseMessage = await httpClient.GetAsync(requestUrl, HttpCompletionOption.ResponseHeadersRead);
if (responseMessage.StatusCode == System.Net.HttpStatusCode.OK)
{
using (var httpStream = await responseMessage.Content.ReadAsStreamAsync())
{
using (var sr = new StreamReader(httpStream))
{
Info(await sr.ReadToEndAsync()); //Info logs the string to a file
}
}
}
2(RESTSharp):
var client = new RestClient();
var request = new RestRequest(requestUrl, Method.GET, DataFormat.Json);
Info(request.Content); //Info logs the string to a file
3:
var httpWebRequest = (HttpWebRequest)WebRequest.Create(requestUrl);
httpWebRequest.ContentType = "application/json; charset-utf8";
var httpWebResponse = httpWebRequest.GetResponse() as HttpWebResponse;
var binReader = new BinaryReader(responseStream);
const int bufferSize = 4096;
byte[] responseBytes;
using (MemoryStream ms = new MemoryStream())
{
byte[] buffer = new byte[bufferSize];
int count;
while ((count = binReader.Read(buffer, 0, buffer.Length)) != 0)
{
ms.Write(buffer, 0, count);
}
responseBytes = ms.ToArray();
}
Info(Encoding.UTF8.GetString(responseBytes, 0, responseBytes.Length)); //Info logs the string to a file
我没有修改 HttpClient.MaxResponseContentBufferSize 属性,但为了更好的衡量,我也尝试更改此值,但无济于事。
我该如何解决这个问题?
我发现了问题,这是由我连接的后端服务引起的。再次感谢@Panagiotis Kanavos