vanesxl
@vanesxl

Как понять что браузер отправил все данные?

Пишу не большой веб сервис который будет отвечать на запрос браузера.
Как я понимаю что по правилам протокола HTTP при подключении браузер посылает на сервер заголовки, но как понять что браузер закончил передавать данные на сервер и ждет ответ от сервера?
Сейчас я делаю это вот так:
static string ReadMessage(SslStream sslStream)
        {
            byte[] buffer = new byte[8];
            StringBuilder messageData = new StringBuilder();
            int bytes = -1;
            while (true)
            {
                bytes = sslStream.Read(buffer, 0, buffer.Length);
                Decoder decoder = Encoding.UTF8.GetDecoder();
                char[] chars = new char[decoder.GetCharCount(buffer, 0, bytes)];
                decoder.GetChars(buffer, 0, bytes, chars, 0);
                messageData.Append(chars);
                if (messageData.ToString().IndexOf("\r\n\r\n") != -1)
                {
                    break;
                }
            }

            Console.WriteLine(messageData);
            return messageData.ToString();
        }

Но это не всегда работает правильно, иногда возникает исключение типа:
System.IO.IOException: "Не удается прочитать данные из транспортного соединения: Попытка установить соединение была безуспешной, т.к. от другого компьютера за требуемое время не получен нужный отклик, или было разорвано уже установленное соединение из-за неверного отклика уже подключенного компьютера."

Я так понимаю это происходит потому что программа пытается прочитать данные с сокета, а их там нет. Как мне прочитать данные правильно?
  • Вопрос задан
  • 82 просмотра
Пригласить эксперта
Ответы на вопрос 1
vabka
@vabka Куратор тега C#
Токсичный шарпист
Если у вас будет перенос строки не через CLRF, то из цикла вы никогда не выйдите и попытаетесь прочитать что-то из сокета, когда он уже закроется.
Вообще, лучше не переизобретать http-сервер и взять уже готовый asp net core
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы