Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/329.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在ASP.NET Core 2.1的API模型中获取用户IP地址?_C#_Asp.net Core_Ip Address_Asp.net Core Webapi_Model Validation - Fatal编程技术网

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

C# 如何在ASP.NET Core 2.1的API模型中获取用户IP地址?,c#,asp.net-core,ip-address,asp.net-core-webapi,model-validation,C#,Asp.net Core,Ip Address,Asp.net Core Webapi,Model Validation,当代码在web API控制器中运行时,我没有获取用户IP地址的问题,但在模型中,我实际上无法使用: this.HttpContext.Connection.RemoteIpAddress.MapToIPv4().ToString(); 我之所以需要用户IP,是因为我需要通过第三方提供商提供的数据对其国家进行地理定位。我可以在web API控制器阶段这样做,但最好是在模型中,这样我可以创建一个自定义注释来完成我的工作,因为我需要在多个模型中重用代码。您可以通过在asp.net core中注入IH

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

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

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

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

public class ModelClass
{
    private readonly IHttpContextAccessor _httpContextAccessor;

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

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

public void GeolocateByIP(string ip)
{
    // do geolocation
}
在控制器操作中,您只需执行以下操作:

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

IHttpContextAccessor
中获取上下文注入到所需的服务类这实际上是有意义的,我想知道为什么在我的模型的构造函数中获取空IHttpContextAccessor。默认情况下,
HttpContextAccessor
服务未注册,因为有轻微的性能影响,而ASP.NETCore只在管道中包含绝对必要的内容。如果需要,可以通过
services.AddHttpContextAccessor()
添加它。但是,这里您仍然应该传递IP地址字符串,但是我已经将其添加为singleton,我在startup.cs services.AddSingleton()中有这行代码;首先,你不应该有那条线。其次,这与
HttpContext
无关。1)您的模型类必须由服务集合实例化,否则依赖关系将无法满足。换句话说,如果您执行类似于
newmymodel()
的操作,或者您的模型实例作为动作参数出现,那么这将不起作用。2)
HttpContext
仅在请求的上下文中可用。例如,如果您在控制器操作之外使用这个类,那么不管怎样,它都很可能为null。