首页 > 解决方案 > HttpListener 在读取输入流时抛出 HttpListenerException (400)

问题描述

我有这个在 .NET 5.0 中运行并侦听端口 80 的非常简单的 C# 代码:

// Create a listener.
HttpListener listener = new HttpListener();
// Add the prefixes.
listener.Prefixes.Add($"http://*:80/");
listener.Start();
Console.WriteLine("Listening... <CTRL+C to quit>");

while (true)
{
    // Note: The GetContext method blocks while waiting for a request.
    HttpListenerContext context = listener.GetContext();
    HttpListenerRequest request = context.Request;
    HttpListenerResponse response = context.Response;
    response.ContentType = "text/plain";

    string requestContent;
    string responseContent = null;

    using (var inputStream = request.InputStream)
    {
        using (var inputStreamReader =
                   new System.IO.StreamReader(inputStream, request.ContentEncoding))
        {
            requestContent = inputStreamReader.ReadToEnd();
        }
    }

    if (condition)
    {
        Console.WriteLine($"[{DateTime.Now:dd-MM-yyyy HH:mm:ss.ff}] " +
                          $"Receveid request from {request.RemoteEndPoint}: " +
                          $"{requestContent}");

        // ...statements...

        responseContent = "...";

        Console.WriteLine($"[{DateTime.Now:dd-MM-yyyy HH:mm:ss.ff}] " +
                          $"Response: {responseContent}");

        response.StatusCode = (int)HttpStatusCode.OK;
    }
    else
    {
        response.StatusCode = (int)HttpStatusCode.Unauthorized;
    }


    byte[] buffer = System.Text.Encoding.UTF8.GetBytes(responseContent ?? string.Empty);
    response.ContentLength64 = buffer.Length;
    response.OutputStream.Write(buffer, 0, buffer.Length);
    response.OutputStream.Close();
}

它工作正常,但有时它会抛出并退出。错误如下:

未处理的异常。System.Net.HttpListenerException (400): System.Net.HttpRequestStream.ReadCore(Byte[] buffer, Int32 offset, Int32 size) at System.Net.HttpRequestStream.Read(Byte[] buffer, Int32 offset, Int32 的未知错误 400大小)在 System.IO.StreamReader.ReadBuffer() 在 System.IO.StreamReader.ReadToEnd() 在 TradingBot.Program.Main(String[] args) 在 /home/teejay/MyProgram/Program.cs:line 138

我遇到了 .NET 4.8 的参考源,但ReadCore似乎不存在。也许它是在 .NET 5.0 中引入的,我找不到参考源。

无论如何寻找.NET 4.8 源代码HttpListenerExceptionHttpRequestStream没有帮助,有 3 个匹配项,但我不明白该代码中发生了什么。

我知道我可以添加一个 try catch 块,我会这样做,但我想了解该错误的原因。奇怪的是,监听服务器在读取输入流时抛出 400,不是吗?

标签: c#.net.net-5httplistener

解决方案


推荐阅读