摘要:結(jié)論使用獲取客戶(hù)端不會(huì)自動(dòng)取中的值需求多帶帶處理。參考資料負(fù)載均衡的場(chǎng)景下如何獲取客戶(hù)端地址
[toc]
場(chǎng)景線上環(huán)境使用Nginx(安裝在宿主機(jī))+Docker進(jìn)行部署,應(yīng)用獲取客戶(hù)端ip地址不正確,獲取客戶(hù)端IP的代碼為Request.HttpContext.Connection.RemoteIpAddress.MapToIPv4()
過(guò)程還原 搭建一個(gè)webapi示例環(huán)境創(chuàng)建一個(gè)新項(xiàng)目
dotnet new webapi -o getRealClientIp
修改模板中的ValuesController的Get方法
// GET api/values [HttpGet] public ActionResult容器相關(guān)配置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 #站點(diǎn)文件 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; }運(yùn)行查看效果
dotnet publish -c Release -o ./publish #編譯 docker-compose up #運(yùn)行容器
curl http://localhost:5000/api/values 172.200.0.1
返回的ip地址172.200.0.1是配置的容器的網(wǎng)關(guān)地址,能獲取到正確的ip
curl http://localhost:5001/api/values 172.200.0.102
返回的ip地址172.200.0.102是nginx容器的地址,沒(méi)有獲取到正確的ip
上面的nginx配置已經(jīng)相關(guān)的轉(zhuǎn)發(fā)參數(shù),并且該參數(shù)配置之前能正常運(yùn)行在php的環(huán)境;
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 相關(guān)代碼,才能獲取到真實(shí)的客戶(hù)端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; }
重新編譯運(yùn)行
dotnet publish -c Release -o ./publish #編譯 docker-compose up #運(yùn)行容器 curl http://localhost:5001/api/values 172.200.0.1 curl http://localhost:5000/api/values 172.200.0.1
直接訪問(wèn)和通過(guò)nginx代理訪問(wèn)返回的ip地址均為172.200.0.1,獲取正確。
結(jié)論asp.net core 使用 Request.HttpContext.Connection.RemoteIpAddress.MapToIPv4()獲取客戶(hù)端ip,不會(huì)自動(dòng)取Header中X-Forwarded-For的值,需求多帶帶處理。
參考資料負(fù)載均衡的場(chǎng)景下ASP.NET Core如何獲取客戶(hù)端IP地址
How do I get client IP address in ASP.NET CORE?
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/27824.html
摘要:結(jié)論使用獲取客戶(hù)端不會(huì)自動(dòng)取中的值需求單獨(dú)處理。參考資料負(fù)載均衡的場(chǎng)景下如何獲取客戶(hù)端地址 [toc] 場(chǎng)景 線上環(huán)境使用Nginx(安裝在宿主機(jī))+Docker進(jìn)行部署,應(yīng)用獲取客戶(hù)端ip地址不正確,獲取客戶(hù)端IP的代碼為Request.HttpContext.Connection.RemoteIpAddress.MapToIPv4() 過(guò)程還原 搭建一個(gè)webapi示例環(huán)境 創(chuàng)建一...
摘要:容器化容器化之多容器應(yīng)用部署容器化部署引言上兩節(jié)我們通過(guò)簡(jiǎn)單的學(xué)習(xí)了的基本操作。基于當(dāng)前項(xiàng)目構(gòu)建的容器服務(wù),依賴(lài)于服務(wù)。最后,使用綜合完成了容器化部署。參考資料容器化容器化之多容器應(yīng)用部署 showImg(https://segmentfault.com/img/remote/1460000012801559); .NET Core容器化@Docker.NET Core容器化之多容器...
摘要:容器化容器化之多容器應(yīng)用部署容器化部署引言上兩節(jié)我們通過(guò)簡(jiǎn)單的學(xué)習(xí)了的基本操作。基于當(dāng)前項(xiàng)目構(gòu)建的容器服務(wù),依賴(lài)于服務(wù)。最后,使用綜合完成了容器化部署。參考資料容器化容器化之多容器應(yīng)用部署 showImg(https://segmentfault.com/img/remote/1460000012801559); .NET Core容器化@Docker.NET Core容器化之多容器...
閱讀 1226·2023-04-25 15:53
閱讀 2101·2021-11-19 09:40
閱讀 3488·2021-10-11 10:59
閱讀 2065·2019-08-30 15:55
閱讀 1954·2019-08-30 15:54
閱讀 2293·2019-08-29 13:03
閱讀 2753·2019-08-28 18:17
閱讀 1508·2019-08-27 10:51