AsyncWebserver_Teensy возвращает неверную строку состоянияC#

Место общения программистов C#
Ответить
Anonymous
 AsyncWebserver_Teensy возвращает неверную строку состояния

Сообщение Anonymous »

Проблема
Мой Teensy подключен к 4 последовательным устройствам, и я использую веб-сервер для предоставления доступа к ним по локальной сети. У меня есть Raspberry Pi, который запрашивает данные с веб-сервера в несколько потоков. Иногда бывает, что запросы к веб-серверу идут одновременно (в течение 1 мс). Примерно в 5% случаев веб-сервер отправляет обратно неверную строку состояния. Например. (0xb0 ce 00 20 b0 ce 00 20)200 OK вместо HTTP/1.1 200 OK. Строка 200 OK присутствует всегда, и полезная нагрузка также не повреждена, просто HTTP/1.1 зашифрован. Я тестировал это с помощью Wireshark. Это вызывает исключение HttpRequestException: получена недопустимая строка состояния: '?? ?? 200 OK'. в моем приложении C# на RPi (также на моем локальном компьютере, я просто для разработки).
Я пытался найти ошибку в коде веб-сервера, но не смог не найти. Я нашел только код, в котором собирается заголовок
https://github.com/khoih-prog/AsyncWebS ... 1.cpp#L265
Обходной путь
Я хочу обойти проблему в приложении C# (.Net 6), перехватив исключение и просмотрев строку состояния. Если он содержит 200 OK, он действителен. Но я не могу получить доступ к ответу в следующем коде:

Код: Выделить всё

HttpResponseMessage response;
try
{
response = await client.GetAsync(url);
}
catch (HttpRequestException exc)
{
Console.WriteLine($"Status Code: {exc.StatusCode}");
Console.WriteLine($"Request error: {exc.ToString()}");
Console.WriteLine($"Request error: {exc.Message}");
}
Выход:

Код: Выделить всё

Request error: System.Net.Http.HttpRequestException: Received an invalid status line: '►? ►?  200 OK'.
at System.Net.Http.HttpConnection.ParseStatusLine(ReadOnlySpan`1 line, HttpResponseMessage response)
at System.Net.Http.HttpConnection.SendAsyncCore(HttpRequestMessage request, Boolean async, CancellationToken cancellationToken)
at System.Net.Http.HttpConnection.SendAsyncCore(HttpRequestMessage request, Boolean async, CancellationToken cancellationToken)
at System.Net.Http.HttpConnectionPool.SendWithVersionDetectionAndRetryAsync(HttpRequestMessage request, Boolean async, Boolean doRequestAuth, CancellationToken cancellationToken)
at System.Net.Http.RedirectHandler.SendAsync(HttpRequestMessage request, Boolean async, CancellationToken cancellationToken)
at System.Net.Http.HttpClient.g__Core|83_0(HttpRequestMessage request, HttpCompletionOption completionOption, CancellationTokenSource cts, Boolean disposeCts, CancellationTokenSource pendingRequestsCts, CancellationToken originalCancellationToken)
at Program.readControllerVerion(String url) in C:\XXX\SANDBOX\ConsoleApp4(.NET6.0)\Program.cs:line 62
Request error: Received an invalid status line: '►? ►?  200 OK'.
Я мог бы посмотреть, содержит ли exc.message Получена неверная строка состояния: и 200 OK, но я не уверен, что это так. лучший способ.
TCP
Я заметил, что TCP-соединение открывается и закрывается для каждого HTTP-запроса, даже если я использую один HttpClient за поток. Кажется, что TCP-соединения перекрывают друг друга. Возможно, из-за этого Teensy испортил строку состояния. Могу ли я заставить HTTP-клиент повторно использовать TCP-соединение?

Подробнее здесь: https://stackoverflow.com/questions/787 ... tatus-line
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»