如何在 .Net API 中获取请求头中的位置?
如何在.NET API中的请求头中获取位置信息?
在项目的project.json中添加一个依赖项:
"Microsoft.AspNetCore.HttpOverrides": "2.2.0"
在Startup.cs的Configure()方法中添加以下代码:
app.UseForwardedHeaders(new ForwardedHeadersOptions { ForwardedHeaders = ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto });
当然,还需要引入以下命名空间:
using Microsoft.AspNetCore.HttpOverrides;
然后,可以通过以下代码来获取IP地址:
Request.HttpContext.Connection.RemoteIpAddress
在我的情况下,在VS中进行调试时,总是得到的是IpV6的localhost,但是在部署到IIS上时,总是得到的是远程IP。
一些有用的链接:
[How do I get client IP address in ASP.NET CORE?](https://stackoverflow.com/questions/28664686) 和 [RemoteIpAddress is always null](https://stackoverflow.com/questions/35441521?noredirect=1&lq=1)
`::1`可能是因为:
> IIS终止连接,然后转发到v.next web服务器Kestrel,所以连接到Web服务器确实来自localhost。([https://stackoverflow.com/a/35442401/5326387](https://stackoverflow.com/a/35442401/5326387))
编辑于2020年12月: 感谢[SolidSnake](https://stackoverflow.com/users/326904/solidsnake): 截至2020年12月,最新版本是2.2.0
编辑于2021年06月: 感谢[Hakan Fıstık](https://stackoverflow.com/users/4390133/hakan-f%C4%B1st%C4%B1k): 在.NET 5中,命名空间是Microsoft.AspNetCore.Builder
这是正确的答案,也在官方关于反向代理的文档中有记录: [learn.microsoft.com/en-us/aspnet/core/host-and-deploy/linux-nginx?tabs=aspnetcore2x#why-use-a-reverse-proxy-server](https://learn.microsoft.com/en-us/aspnet/core/host-and-deploy/linux-nginx?tabs=aspnetcore2x#why-use-a-reverse-proxy-server)
需要指出的是,"app.UseForwardedHeaders..."需要在app.UseAuthentication();之前添加,如果使用了身份验证。
这在我本地托管的IIS和Azure上都完美地工作。
截至2020年12月,最新版本是2.2.0
在.NET 5中,命名空间是Microsoft.AspNetCore.Builder
什么都没有改变,UseForwardedHeaders()扩展方法和ForwardedHeadersOptions类始终在Microsoft.AspNetCore.Builder中,而ForwardedHeaders仍然在Microsoft.AspNetCore.HttpOverrides中。
这个解决方案在使用.NET (core) 6.0.6时对我完美地工作。
Connection.RemoteIpAddress是正确的;如果您使用内容分发网络或额外的反向代理层,您需要根据您的设置进一步配置UseForwardedHeaders() -- 参见官方文档中关于配置高级场景的链接。
如何在.Net API中的请求头中获取位置信息?
最近API进行了更新。虽然不确定更改时间,但根据Damien Edwards在12月底的一条推文,现在可以这样做:
var remoteIpAddress = request.HttpContext.Connection.RemoteIpAddress;
对于我来说,当我在IIS上发布网站并将其记录在文件中时,RemoteIpAddress
始终为null
。
目前,这个API存在一个bug,导致返回值为null
。github.com/aspnet/IISIntegration/issues/17
看起来这个问题在rc 2中已经修复了。
System.Net.IPAddress remoteIpAddress = this.Request.HttpContext.Connection.RemoteIpAddress;
即使在远程连接时,我始终得到127.0.0.1。
对我来说,这返回的是IPv6格式的"::1"。其他人是如何看到127.0.0.1的?
还有其他人得到了IIS服务器的本地IP地址吗?
看起来它似乎不能将localhost解析为IP地址。如果您使用127.0.0.1而不是localhost,它应该显示IP地址。
context.HttpContext.Connection.RemoteIpAddress.MapToIPv4();
这将返回0.0.0.1。
这个答案是不正确的,它总是返回127.0.0.1。
提醒一下,它返回"::1"是因为您在本地运行,当在本地运行时,它总是返回这个值。
这是正确的属性,但如果您使用了任何类型的反向代理、负载均衡器或内容分发,请根据Johna的答案配置UseForwardedHeaders()。