1. 程式人生 > 其它 >.netcore獲取IP地址,Nginx作為反向代理的情況下

.netcore獲取IP地址,Nginx作為反向代理的情況下

 

第一步:增加nginx代理http頭

server {

listen 80

location / {

proxy_set_header X-Real-IP $remote_addr;

proxy_set_header Host $host;

proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

proxy_pass http://localhost:5000; }

}

第二步:core專案中增加獲取IP地址的幫助類

public static class GetHostIP
{
/// <summary>
/// 獲取客戶Ip
/// </summary>
/// <param name="context"></param>
/// <returns></returns>
public static string GetClientUserIp(this HttpContext context)
{
var userHostAddress = context.Request.Headers["X-Forwarded-For"].FirstOrDefault();
if (string.IsNullOrEmpty(userHostAddress))
{
userHostAddress = context.Connection.RemoteIpAddress.ToString();//這個是直接IP,如果經過反向代理IP會變成代理機的,如果代理機就是本機就會變成127.0.0.1
}

//最後判斷獲取是否成功,並檢查IP地址的格式
if (!string.IsNullOrEmpty(userHostAddress) && IsIP(userHostAddress))
{
return userHostAddress;
}
return "127.0.0.1";
}

/// <summary>
/// 檢查IP地址格式
/// </summary>
/// <param name="ip"></param>
/// <returns></returns>
public static bool IsIP(string ip)
{
return System.Text.RegularExpressions.Regex.IsMatch(ip, @"^((2[0-4]\d|25[0-5]|[01]?\d\d?)\.){3}(2[0-4]\d|25[0-5]|[01]?\d\d?)$");
}
}

補充說明

HttpContext 物件

1.在Mvc 控制器例項中包含了上下文物件,可以直接使用

 

2.使用IHttpContextAccessor介面獲取HttpContext物件

2.1我們先要將它註冊到ServiceCollection中,否則無法獲取到這個物件。

public void ConfigureServices(IServiceCollection services)
{
//services.AddHttpContextAccessor(); services.TryAddSingleton<IHttpContextAccessor, HttpContextAccessor>(); }

 2.2使用時,可以使用建構函式注入的方式獲取到這個物件

 

 

2.3使用時,手動獲取物件

public class TestClass
    {
        public static IServiceProvider ServiceProvider;
        public static HttpContext GetContext()
        {
            object factory = ServiceProvider.GetService(typeof(Microsoft.AspNetCore.Http.IHttpContextAccessor));

            HttpContext context = ((IHttpContextAccessor)factory).HttpContext;

            return context;
        }
    }