如何在 ASP.NET Core 2.1 的 API 模型中获取用户 IP 地址?

How to get user IP address in API model in ASP.NET Core 2.1?

我在网络 API 控制器中的代码是 运行 时获取用户 IP 地址没有问题,但在模型中我实际上无法使用:

this.HttpContext.Connection.RemoteIpAddress.MapToIPv4().ToString();

我需要用户 IP 的原因是我需要通过第三方提供商提供的数据进行比较来定位其国家/地区。我可以在 web API 控制器阶段执行此操作,但最好在模型中使用,这样我可以创建自定义注释来完成我的工作,因为我需要在多个模型中重用代码。

您可以通过在 asp.net 核心中注入 IHttpContextAccesor 来访问 HttpContext

public class ModelClass
{
    private readonly IHttpContextAccessor _httpContextAccessor;

    public ModelClass(IHttpContextAccessor httpContextAccessor)
    {
        _httpContextAccessor = httpContextAccessor;
    }
}

你在这里破坏了 SOLID。您的模型不适合了解 HttpContext 或如何从中检索远程 IP 地址。您想要封装到模型中的逻辑只需要一个 IP 地址,因此 that 就是您应该提供的。这可以在模型的构造函数中提供 class 或仅作为需要使用它的特定方法的参数。例如,创建如下方法:

public void GeolocateByIP(string ip)
{
    // do geolocation
}

然后,在您的控制器操作中,您只需执行以下操作:

model.GeolocateByIP(HttpContext.Connection.RemoteIpAddress.MapToIPv4().ToString());