【问题标题】:How to get user IP address in API model in ASP.NET Core 2.1?如何在 ASP.NET Core 2.1 的 API 模型中获取用户 IP 地址?
【发布时间】:2018-10-07 16:00:07
【问题描述】:

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

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

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

【问题讨论】:

  • IHttpContextAccesor获取上下文注入所需的服务类

标签: c# asp.net-core ip-address asp.net-core-webapi model-validation


【解决方案1】:

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

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

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

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

【讨论】:

  • 这实际上是有道理的,我想知道为什么我在模型的构造函数中得到了 null IHttpContextAccessor。
  • HttpContextAccessor 服务默认未注册,因为这会对性能造成轻微影响,并且 ASP.NET Core 只包含管道中绝对必要的内容。如果需要,可以通过services.AddHttpContextAccessor() 添加。但是,在这里您仍然应该只传递 IP 地址字符串。
  • 但是我已经将它添加为单例,我的 startup.cs services.AddSingleton(); 中有这行代码
  • 首先,你应该有那一行。其次,这与HttpContext无关。
  • 1) 您的模型类必须由服务集合实例化,否则将无法满足依赖关系。换句话说,例如,如果您执行new MyModel() 之类的操作,或者您的模型实例作为动作参数出现,那么这将不起作用。 2) HttpContext 仅在请求上下文期间可用。例如,如果您在控制器操作之外使用此类,则它很可能为 null。
【解决方案2】:

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

public class ModelClass
{
    private readonly IHttpContextAccessor _httpContextAccessor;

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-04-24
    • 2020-04-29
    • 2020-05-16
    • 1970-01-01
    • 1970-01-01
    • 2019-12-07
    • 1970-01-01
    相关资源
    最近更新 更多