ASP.NET Core 8 MVC项目获取IP地址报错的解决方法求助
解决ASP.NET Core 8 MVC中获取IP地址的SocketException问题
你遇到的异常是因为RemoteIpAddress可能是IPv6类型的IP地址实例,而Address属性仅适用于IPv4地址,直接访问会触发"不支持地址族"的SocketException。以下是修复方案:
1. 安全获取IP地址字符串
不要直接访问Address属性,改用以下代码兼容IPv4和IPv6场景:
var remoteIpAddress = HttpContext.Connection.RemoteIpAddress; string clientIp = string.Empty; if (remoteIpAddress != null) { // 处理IPv6映射的IPv4地址(常见于本地调试或部分代理场景) if (remoteIpAddress.IsIPv4MappedToIPv6) { clientIp = remoteIpAddress.MapToIPv4().ToString(); } else { clientIp = remoteIpAddress.ToString(); } }
2. 部署环境:处理反向代理场景
如果项目部署在Nginx、IIS等反向代理之后,默认RemoteIpAddress会返回代理服务器的IP而非客户端真实IP,此时需要配置转发头:
在Program.cs中添加以下配置:
// 配置转发头选项 builder.Services.Configure<ForwardedHeadersOptions>(options => { options.ForwardedHeaders = ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto; // 添加已知代理服务器的IP,根据实际部署环境调整 options.KnownProxies.Add(IPAddress.Parse("127.0.0.1")); }); // 在路由中间件之前启用转发头 app.UseForwardedHeaders(); app.UseRouting();
异常原因说明
当RemoteIpAddress是IPv6地址时,调用Address属性会抛出SocketException(错误代码10045),因为该属性是IPv4地址专属字段,用于获取32位的IPv4地址数值,完全不适用于128位的IPv6地址结构。
内容的提问来源于stack exchange,提问作者Madhu Patel
相关产品推荐
相关产品推荐

