C# .NET Framework下HttpListener搭建HTTP服务局域网访问报400错误
HttpListener局域网访问400错误解决方案
问题根因
当前代码中HttpListener仅配置了http://localhost:24578/作为监听前缀,这意味着服务只会接收主机头为localhost的请求。来自局域网其他设备的请求主机头为192.168.1.108,会直接被HttpListener底层拒绝返回400错误,不会触发你的业务处理逻辑。
解决步骤
修改监听前缀配置
你可以根据需求选择以下任意一种配置:- 监听所有网卡的请求(测试场景最方便):添加前缀
http://*:24578/ - 仅监听指定局域网IP的请求:添加前缀
http://192.168.1.108:24578/
注意:所有前缀必须以斜杠/结尾,否则会抛出配置异常。如果需要保留localhost本地访问能力,可以同时添加多个前缀。
- 监听所有网卡的请求(测试场景最方便):添加前缀
配置系统权限
Windows系统下,绑定非localhost的监听前缀需要管理员权限,你可以二选一处理:- 直接以管理员身份运行你的程序
- 以管理员身份打开命令提示符,执行以下命令预留URL权限,之后普通身份即可运行程序:
netsh http add urlacl url=http://*:24578/ user=Everyone
放开防火墙端口
进入Windows Defender防火墙,添加入站规则,允许24578端口的TCP连接,避免局域网其他设备的请求被防火墙拦截。优化代码逻辑
原有代码中每次处理完单个请求就调用listener.Stop(),会导致服务在处理完请求后短暂停止监听,容易丢失请求,建议将listener.Start()移到循环外部,仅在程序退出时执行停止逻辑。
修正后示例代码
using System.Net; using System.Text; using System.IO; HttpListener listener = new HttpListener(); // 同时支持本地localhost和指定局域网IP访问,也可直接写http://*:24578/监听所有网卡 listener.Prefixes.Add("http://localhost:24578/"); listener.Prefixes.Add("http://192.168.1.108:24578/"); // 启动逻辑移到循环外,无需反复启停 listener.Start(); Console.WriteLine("服务已启动,监听端口24578"); try { while (true) { HttpListenerContext context = listener.GetContext(); HandleRequest(context.Request); string responseString = "<HTML><BODY><p>Test</br>Test new line</p></BODY></HTML>"; byte[] buffer = Encoding.UTF8.GetBytes(responseString); context.Response.ContentLength64 = buffer.Length; using Stream output = context.Response.OutputStream; output.Write(buffer, 0, buffer.Length); context.Response.Close(); } } finally { listener.Stop(); listener.Close(); }
内容的提问来源于stack exchange,提问作者Arkomega
相关产品推荐
相关产品推荐

