请问如何在ASP中获取客户端IP地址?NET时使用MVC 6。 请求。ServerVariables["REMOTE_ADDR"]无效。


当前回答

在ASP。NET 2.1,在StartUp.cs中添加此服务:

services.AddHttpContextAccessor();
services.TryAddSingleton<IActionContextAccessor, ActionContextAccessor>();

然后做3步:

在MVC控制器中定义一个变量 private IHttpContextAccessor _accessor DI转换为控制器的构造函数 IHttpContextAccessor访问器 { _accessor = accessor; } 检索IP地址 _accessor.HttpContext.Connection.RemoteIpAddress.ToString ()

事情是这样的。

其他回答

您可以使用IHttpConnectionFeature来获取此信息。

var remoteIpAddress = httpContext.GetFeature<IHttpConnectionFeature>()?.RemoteIpAddress;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Http.Features;

public string GetClientIPAddress(HttpContext context)
    {
        string ip = string.Empty;
if (!string.IsNullOrEmpty(context.Request.Headers["X-Forwarded-For"]))
        {
            ip = context.Request.Headers["X-Forwarded-For"];
        }
        else
        {
            ip = context.Request.HttpContext.Features.Get<IHttpConnectionFeature>().RemoteIpAddress.ToString();
        }
        return ip;
    }

你想获取Ip地址;

GetClientIPAddress(HttpContext);

您还可以使用api.db-ip.com web服务获取IP地址和位置。

这项服务是免费的,但有一个限制:每天1000次请求。

public string GetRemoteIP()
{
    HttpClient client = new HttpClient();
    var result = client.GetStringAsync("https://api.db-ip.com/v2/free/self").Result;
    var ip = JsonSerializer.Deserialize<RemoteIPDto>(result.ToString()).IP;
    return ip;
}
public static string GetUserAddress()
{
      HttpClient client = new HttpClient();
      var result = client.GetStringAsync("https://api.db-ip.com/v2/free/self").Result;
      var location = result.ToString();
      return remoteAddress;
}

RemoteIPDto类在哪里

public class RemoteIPDto
{
    [JsonPropertyName("ipAddress")]
    public string IP { get; set; }
    [JsonPropertyName("continentCode")]
    public string ContinentCode { get; set; }
    [JsonPropertyName("continentName")]
    public string ContinentName { get; set; }
    [JsonPropertyName("countryCode")]
    public string CountryCode { get; set; }
    [JsonPropertyName("countryName")]
    public string CountryName { get; set; }
    [JsonPropertyName("city")]
    public string City { get; set; }
}

在IIS上使用负载均衡器运行。net core(3.1.4)不能与其他建议的解决方案一起工作。

手动读取X-Forwarded-For报头可以。 这段代码假设这个报头包含一个IP。

IPAddress ip;
var headers = Request.Headers.ToList();
if (headers.Exists((kvp) => kvp.Key == "X-Forwarded-For"))
{
    // when running behind a load balancer you can expect this header
    var header = headers.First((kvp) => kvp.Key == "X-Forwarded-For").Value.ToString();
    // in case the IP contains a port, remove ':' and everything after
    ip = IPAddress.Parse(header.Remove(header.IndexOf(':')));
}
else
{
    // this will always have a value (running locally in development won't have the header)
    ip = Request.HttpContext.Connection.RemoteIpAddress;
}

感谢@JawadAlShaikh和@BozoJoe指出IP可以包含一个端口,x - forward - for可以包含多个IP。

截至2021年9月- ASP。NET Core (5.x) MVC项目允许我在我的控制器中以这种方式获取IP地址:

Request.HttpContext.Connection.RemoteIpAddress

现在似乎比过去简单多了。