Приложение C # /. NET, использующее SimpleHttpServer, не возвращает ответ браузеру? - PullRequest
0 голосов
/ 02 августа 2020

ПРИМЕЧАНИЕ. Это не приложение Python, это C#.

Я создал приложение C#, которое я пытаюсь превратить в простой сервер, используя этот простой модуль C# Я нашел в Интернете:

https://gist.github.com/aksakalli/9191056

У меня все подключено, но когда я обращаюсь к своему серверу из браузера, он никогда не получает ответа. Я проверил это, используя вкладку Сеть в отладчике Chrome. Я вижу сделанный запрос, но подпанель «Ответ» всегда пуста.

Я отследил код своего сервера, и он работает без ошибок, но после добавления заголовков в ответ и закрытия выходного потока ничего не происходит на стороне браузера. Ниже приведены релевантные части моего кода. Может ли кто-нибудь сказать мне, почему мой браузер никогда не отвечает и как это исправить?

    public delegate Task<string> ProcessHttpContext(HttpListenerContext context);
    private ProcessHttpContext _processHttpContextFunc = null;

    public SimpleHTTPServer(string path, int port, ProcessHttpContext processHttpContextFunc)
    {
        this.Initialize(path, port);
        this._processHttpContextFunc = processHttpContextFunc;
    }

    public SimpleHTTPServer(string path)
    {
        //get an empty port
        TcpListener l = new TcpListener(IPAddress.Loopback, 0);
        l.Start();
        int port = ((IPEndPoint)l.LocalEndpoint).Port;
        l.Stop();
        this.Initialize(path, port);
    }

    public void Stop()
    {
        _serverThread.Abort();
        _listener.Stop();
    }

    private void Listen()
    {
        _listener = new HttpListener();
        _listener.Prefixes.Add("http://+:" + _port.ToString() + "/main-page/");
        _listener.Start();

        while (true)
        {
            try
            {
                HttpListenerContext context = _listener.GetContext();
                Process(context);
            }
            catch (Exception ex)
            {
                Debug.WriteLine("Exception occurred during GetContext() call: " + ex.Message);
                if (ex.InnerException != null)
                    Debug.WriteLine("  Inner Exception: " + ex.InnerException.Message);
            }
        }
    }

    async private void Process(HttpListenerContext context)
    {
        if (context == null)
            throw new ArgumentNullException("The context parameter is empty.");

        try
        {
                // Call it with the current context.
                string strResult = await this._processHttpContextFunc(context);
                byte[] bytes = System.Text.Encoding.UTF8.GetBytes(strResult);

                context.Response.AddHeader("Content-Type", "text/plain; charset=UTF-8");
                context.Response.AddHeader("Content-Length", strResult.Length.ToString());
                context.Response.SendChunked = false;
                context.Response.StatusCode = (int)HttpStatusCode.OK;
                context.Response.StatusDescription = "OK";
                context.Response.OutputStream.Write(bytes, 0, bytes.Length);
                context.Response.OutputStream.Flush();
            }
        }
        catch (Exception ex)
        {
            context.Response.StatusCode = (int)HttpStatusCode.InternalServerError;
        }
        context.Response.OutputStream.Close();
    }

    private void Initialize(string path, int port)
    {
        this._rootDirectory = path;
        this._port = port;
        _serverThread = new Thread(this.Listen);
        _serverThread.Start();
    }
...