C#Http服务器报HttpListener拒绝访问异常解决方法

本文介绍了解决在Windows 7环境下使用HttpListener搭建HTTP服务器时遇到的拒绝访问异常问题的方法。通过删除并重新配置URLACL权限及设置防火墙规则,使服务器能够成功监听指定端口。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题: Win7下在尝试搭建简单http服务器的时候,执行httpListener.Start();报错 HttpListener拒绝访问异常
代码如下:
HttpListener httpListener = new HttpListener();//创建服务器监听
httpListener.Prefixes.Add("http://+:8080/");//配置监听地址。+代表本机可能的IP如localhost、127.0.0.1、192.168.199.X(本机IP)等;
httpListener.Start(); //开启对指定URL和端口的监听,开始处理客户端输入请求。
解决方法:
以管理员CMD命令行执行:
①先删除可能存在的错误urlacl,这里的*号代指localhost、127.0.0.1、192.168.199.X本地地址和+号等。
命令:netsh http delete urlacl url=http://*:8080/ 
举例:netsh http delete urlacl url=http://+:8080/ 
②将上面删除的*号地址重新加进url,user选择所有人
命令:netsh http add urlacl url=http://*:8080/  user=Everyone
举例:netsh http add urlacl url=http://+:8080/  user=Everyone
③CMD配置防火墙
netsh advfirewall firewall Add rule name=\"命令行Web访问8080\" dir=in protocol=tcp localport=8080 action=allow
经过如上设置服务端就可以以httpListener.Prefixes.Add("http://+:8080/");监听地址开启监听。客户端可以通过访问服务端8080端口。服务端本机也可以在浏览器中以localhost和127.0.0.1访问自身http服务器。
17.8.23补充:
上面的命令最好手打一下输入,今天尝试复制到cmd执行的时候会报无法识别命令的错误。
<think>好的,用户想了解如何用C#编写一个HTTP服务器,并实现根据IP地址拒绝访问的功能。首先,我需要回顾一下C#中创建HTTP服务器的相关知识。在.NET中,可以使用HttpListener类来创建简单的HTTP服务器,这个类在System.Net命名空间下,允许处理HTTP请求和响应。 接下来,用户的需求是阻止特定IP的访问。根据引用[1]中的内容,提到通过配置.htaccess文件来允许或阻止IP,但C#中需要手动实现类似功能。因此,我需要设计一个机制,在接收到请求时检查客户端IP,如果在黑名单中,则返回禁止访问的响应。 首先,创建HTTP服务器的基本步骤包括初始化HttpListener对象,添加前缀(如http://*:8080/),然后开始监听。处理请求时,需要异步处理每个上下文,获取客户端的IP地址。获取IP可以通过HttpListenerRequest的RemoteEndPoint属性,但要注意可能存在的代理或负载均衡器情况,这时候可能需要检查X-Forwarded-For头,不过对于简单的实现,直接取RemoteEndPoint的Address即可。 然后,实现IP过滤。维护一个IP黑名单列表,可以是List<string>或者HashSet<string>,在每次请求到来时检查客户端的IP是否在黑名单中。如果在,则返回403 Forbidden状态码;否则正常处理请求。 另外,要注意线程安全和性能问题。由于HttpListener是异步处理的,黑名单的访问需要确保线程安全,可以使用ConcurrentHashSet或者加锁机制。不过如果黑名单在初始化后不经常变动,简单的读取操作可能不需要复杂的同步。 代码示例部分,需要展示如何初始化服务器,添加黑名单,处理请求并检查IP。同时,根据引用[2]中提到的TCP/IP相关实现,确保网络数据传输的正确性。例如,正确获取客户端IP,处理可能的异常,如无效的IP格式,或者在监听时权限不足的问题(可能需要管理员权限绑定端口)。 测试部分,用户可能需要知道如何验证功能是否有效。例如,使用浏览器或curl命令访问服务器,查看是否被阻止。同时,处理异常情况,如黑名单为空,或者无效IP加入的情况。 最后,生成相关问题,可能涉及性能优化、日志记录、动态加载黑名单等扩展功能。根据引用[3]和[4]中的内容,可以联想到文件操作或图片处理,但当前问题主要围绕HTTP服务器和IP过滤,因此相关问题应围绕这两个主题展开。 总结步骤: 1. 使用HttpListener创建HTTP服务器。 2. 维护IP黑名单列表。 3. 在请求处理时检查客户端IP,阻止黑名单中的IP。 4. 返回适当的响应状态码。 5. 处理异常和权限问题。</think>以下是使用C#实现HTTP服务器并阻止特定IP访问的分步指南: ### 一、创建基础HTTP服务器 使用`HttpListener`类创建服务器核心结构: ```csharp using System.Net; using System.Collections.Generic; HashSet<string> blockedIPs = new HashSet<string> { "192.168.0.100", "10.0.0.5" }; HttpListener listener = new HttpListener(); listener.Prefixes.Add("http://*:8080/"); // 需管理员权限 listener.Start(); while (true) { var context = await listener.GetContextAsync(); ProcessRequest(context); } ``` ### 二、实现IP过滤逻辑 在请求处理方法中添加访问控制: ```csharp void ProcessRequest(HttpListenerContext ctx) { string clientIP = ctx.Request.RemoteEndPoint?.Address.ToString(); // 处理IPv4映射的IPv6地址(如::ffff:192.168.0.1) if(clientIP?.Contains("::ffff:") == true) clientIP = clientIP.Split(':').Last(); if (blockedIPs.Contains(clientIP)) { ctx.Response.StatusCode = 403; ctx.Response.Close(); return; } // 正常处理逻辑 byte[] buffer = Encoding.UTF8.GetBytes("Access Granted"); ctx.Response.ContentLength64 = buffer.Length; ctx.Response.OutputStream.Write(buffer, 0, buffer.Length); ctx.Response.Close(); } ``` ### 三、安全增强建议 1. **IP获取优化**: ```csharp string GetClientIP(HttpListenerRequest request) { string realIP = request.Headers["X-Real-IP"]; return !string.IsNullOrEmpty(realIP) ? realIP : request.RemoteEndPoint.Address.MapToIPv4().ToString(); } ``` 支持反向代理场景下的真实IP获取[^2] 2. **动态加载黑名单**: ```csharp void LoadBlockList(string filePath) { blockedIPs = new HashSet<string>( File.ReadAllLines(filePath) .Where(ip => IPAddress.TryParse(ip, out _)) ); } ``` ### 四、运行注意事项 1. 需要以管理员身份运行程序(绑定端口需要权限) 2. 防火墙需开放对应端口 3. 支持IPV4/IPV6双栈访问
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值