ответ c # JSON REST с помощью 3 разных подходов (WebRequest, RestSharp, HttpClient) пуст, но Postman и браузер работают

#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