You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.14 02:09:03