摘要:结论使用获取客户端不会自动取中的值需求多带带处理。参考资料负载均衡的场景下如何获取客户端地址
[toc]
场景线上环境使用Nginx(安装在宿主机)+Docker进行部署,应用获取客户端ip地址不正确,获取客户端IP的代码为Request.HttpContext.Connection.RemoteIpAddress.MapToIPv4()
过程还原 搭建一个webapi示例环境创建一个新项目
dotnet new webapi -o getRealClientIp
修改模板中的ValuesController的Get方法
// GET api/values [HttpGet] public ActionResult容器相关配置Get() { return this.Request.HttpContext.Connection.RemoteIpAddress.MapToIPv4().ToString(); }
docker-compose.yml
version: "2" services: web: image: microsoft/dotnet:2.1-aspnetcore-runtime volumes: - ./publish:/app #站点文件 command: dotnet /app/getRealClientIp.dll ports: - "5000:80" networks: test: ipv4_address: 172.200.0.101 nginx: image: nginx networks: test: ipv4_address: 172.200.0.102 volumes: - ./nginx.conf:/etc/nginx/nginx.conf:ro # nginx配置文件 ports: - "5001:80" networks: test: ipam: config: - subnet: 172.200.0.0/16 gateway: 172.200.0.1
nginx.conf
http { server { listen 80; access_log off; location / { proxy_pass http://172.200.0.101:80; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Via "nginx"; } } } events { worker_connections 1024; }运行查看效果
dotnet publish -c Release -o ./publish #编译 docker-compose up #运行容器
curl http://localhost:5000/api/values 172.200.0.1
返回的ip地址172.200.0.1是配置的容器的网关地址,能获取到正确的ip
curl http://localhost:5001/api/values 172.200.0.102
返回的ip地址172.200.0.102是nginx容器的地址,没有获取到正确的ip
上面的nginx配置已经相关的转发参数,并且该参数配置之前能正常运行在php的环境;
proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
推断必须修改 asp.net core 相关代码,才能获取到真实的客户端ip地址,一番google之后,
// GET api/values [HttpGet] public ActionResultGet() { var ip = this.Request.Headers["X-Forwarded-For"].FirstOrDefault(); if (string.IsNullOrEmpty(ip)) { ip = this.Request.HttpContext.Connection.RemoteIpAddress.MapToIPv4().ToString(); } return ip; }
重新编译运行
dotnet publish -c Release -o ./publish #编译 docker-compose up #运行容器 curl http://localhost:5001/api/values 172.200.0.1 curl http://localhost:5000/api/values 172.200.0.1
直接访问和通过nginx代理访问返回的ip地址均为172.200.0.1,获取正确。
结论asp.net core 使用 Request.HttpContext.Connection.RemoteIpAddress.MapToIPv4()获取客户端ip,不会自动取Header中X-Forwarded-For的值,需求多带带处理。
参考资料负载均衡的场景下ASP.NET Core如何获取客户端IP地址
How do I get client IP address in ASP.NET CORE?
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/27824.html
摘要:结论使用获取客户端不会自动取中的值需求单独处理。参考资料负载均衡的场景下如何获取客户端地址 [toc] 场景 线上环境使用Nginx(安装在宿主机)+Docker进行部署,应用获取客户端ip地址不正确,获取客户端IP的代码为Request.HttpContext.Connection.RemoteIpAddress.MapToIPv4() 过程还原 搭建一个webapi示例环境 创建一...
摘要:容器化容器化之多容器应用部署容器化部署引言上两节我们通过简单的学习了的基本操作。基于当前项目构建的容器服务,依赖于服务。最后,使用综合完成了容器化部署。参考资料容器化容器化之多容器应用部署 showImg(https://segmentfault.com/img/remote/1460000012801559); .NET Core容器化@Docker.NET Core容器化之多容器...
摘要:容器化容器化之多容器应用部署容器化部署引言上两节我们通过简单的学习了的基本操作。基于当前项目构建的容器服务,依赖于服务。最后,使用综合完成了容器化部署。参考资料容器化容器化之多容器应用部署 showImg(https://segmentfault.com/img/remote/1460000012801559); .NET Core容器化@Docker.NET Core容器化之多容器...
阅读 1201·2023-04-25 15:53
阅读 2078·2021-11-19 09:40
阅读 3420·2021-10-11 10:59
阅读 2050·2019-08-30 15:55
阅读 1936·2019-08-30 15:54
阅读 2254·2019-08-29 13:03
阅读 2725·2019-08-28 18:17
阅读 1473·2019-08-27 10:51