@Alexj0k

Ошибка в потоке содержащем бесконечный цикл, как решить?

Здравствуйте, не могу разобраться в чем заключается проблема, каким образом можно решить данную ситуацию? Исключение появляется при подключении через браузер к этому, если можно так выразиться, серверу.

Описание исключения:
Необработанное исключение типа "System.InvalidOperationException" в System.dll
Дополнительные сведения: Эта операция не может быть выполнена после передачи отклика.


Stack Trace:
в System.Net.HttpListenerResponse.set_ContentLength64(Int64 value)
в WEB_Server.ChildThread.Connections(Boolean isListening, HttpListenerContext context) в E:\Visual Studio\Projects\WEB-Server\WEB-Server\Source Code\ChildThread.cs:строка 38
в WEB_Server.Program.<>c.b__9_0() в E:\Visual Studio\Projects\WEB-Server\WEB-Server\Source Code\Program.cs:строка 59
в System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
в System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
в System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
в System.Threading.ThreadHelper.ThreadStart()


Создание отдельного потока реализовано таким образом:
_t = new Thread(()=> ChildThread.Connections(_server.IsListening, _server.GetContext()));
            _t.Start();


Класс содержащий цикл:
using System.Net;
using System.Text;

namespace WEB_Server
{
    internal class ChildThread : Program
    {
        internal static void Connections(bool isListening, HttpListenerContext context)
        {
            while (isListening)
            {
                if (!Flag)
                {
                    SwitchOff_Server();
                    break;
                }

                var request = context.Request;

                if (request.HttpMethod == "POST")
                {
                    FileIO.logHandler(request);
                    ShowRequestData(request);
                    if (!Flag) return;
                }

                const string responseString = @"<!DOCTYPE HTML>
                    <html><head></head><body>
                    <form method=""post"" action=""say"">
                    <p><b>Name: </b><br>
                    <input type=""text"" name=""myname"" size=""40""></p>
                    <p><input type=""submit"" value=""send""></p>
                    </form></body></html>";

                var response = context.Response;
                response.ContentType = "text/html; charset=UTF-8";
                var buffer = Encoding.UTF8.GetBytes(responseString);
                response.ContentLength64 = buffer.Length; // <=== в этом месте проявляется исключение при подключении через браузер

                using (var output = response.OutputStream)
                {
                    output.Write(buffer, 0, buffer.Length);
                }
            }
        }
    }
}
  • Вопрос задан
  • 414 просмотров
Пригласить эксперта
Ответы на вопрос 1
Ну, судя по описанию ContentLength исключение InvalidOperationException появляется при "The response is already being sent." Т.е. когда данные уже отправлены свойство ContentLength задавать нельзя.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Похожие вопросы