Мой 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'.
TCP
Я заметил, что TCP-соединение открывается и закрывается для каждого HTTP-запроса, даже если я использую один HttpClient за поток. Кажется, что TCP-соединения перекрывают друг друга. Возможно, из-за этого Teensy испортил строку состояния. Могу ли я заставить HTTP-клиент повторно использовать TCP-соединение?
Подробнее здесь: https://stackoverflow.com/questions/787 ... tatus-line
Мобильная версия