c# - 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 源代码HttpListenerException
并HttpRequestStream
没有帮助,有 3 个匹配项,但我不明白该代码中发生了什么。
我知道我可以添加一个 try catch 块,我会这样做,但我想了解该错误的原因。奇怪的是,监听服务器在读取输入流时抛出 400,不是吗?
解决方案
推荐阅读
- android-studio - 如何在 Android Studio 4.1 的“版本控制/Git”选项卡中找回丢失的“本地更改”选项卡?
- javascript - 检查访问 1 小时
- html - SVG 多边形填充 svg 父级
- c# - 我们如何通过使用 Twilio API 进行分页来获取具有特定日期持续时间的通话记录?
- makefile - 包括在不同目录中具有相同名称的特定头文件
- rust - 我何时以及为什么要使用 i8 而不是 i32?
- php - 有没有办法让一个数字在while循环中每次增加1?
- mysql - 何时使用复合键而不是自动递增
- google-cloud-storage - 每秒处理 350k 个请求并将数据保存到 Google Cloud Storage
- r - 在 R 中选择特定水平的因子