#c# #json #rest #restsharp
#c# #json #rest #restsharp
Вопрос:
При вызове определенной конечной точки на C #, которая работает без проблем в Postman (или через Firefox), я получаю пустой ответ.
Вызываемый URL-адрес возвращает набор данных. В параметрах url я могу указать, сколько из указанных данных мне нужно. Я проверил размер ответа в Postman, и когда я ограничиваю объем данных, запрашиваемых в моем вызове C #, таким образом, чтобы ответ составлял около 700 КБ, тогда я получаю ответ JSON обратно.
Однако, если я превышу этот размер в вызове C #, тогда ответ будет пустым ‘{ }’, а возвращаемая длина содержимого = -1 (возвращаемый код состояния равен 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, но для пущей убедительности я также пытался изменить это значение, но безрезультатно.
Как я могу это решить?
Комментарии:
1. Postman может экспортировать запрос в код C #. Можете ли вы попробовать этот код?
2. Все эти подходы используют HttpClient на самом низком уровне. Все они работают просто отлично. 700 КБ — это тоже очень маленький файл. Кроме того, разве вы только что не сказали, что даже в POSTMAN вы можете вернуть только до 700 КБ? Похоже, что служба отклоняет запросы, которые возвращают больше данных
3. Каков фактический ответ, когда это произойдет? Каков код состояния? Код C # просто игнорирует сбои, он не регистрирует их. Возможно, вы получаете 400 (неверный запрос)
4. Существует свойство HttpClient.MaxResponseContentBufferSize ( learn.microsoft.com/en-us/dotnet/api /… ) Есть ли шанс, что вы изменили это свойство
5. «Кроме того, разве вы только что не сказали, что даже в POSTMAN вы можете вернуть только до 700 КБ? Похоже, что служба отклоняет запросы, которые возвращают больше данных » @PanagiotisKanavos в Postman (или браузере) он работает нормально, независимо от размера ответа. К сожалению, проблема возникает только в C #…
Ответ №1:
Я обнаружил проблему, она была вызвана серверной службой, к которой я подключался. Еще раз спасибо @Panagiotis Kanavos