asp.net-mvc - remote - net core request ip




Как я могу получить IP-адрес клиента в ASP.NET MVC? (4)

В классе вы можете назвать это следующим образом:

public static string GetIPAddress(HttpRequestBase request) 
{
    string ip;
    try
    {
        ip = request.ServerVariables["HTTP_X_FORWARDED_FOR"];
        if (!string.IsNullOrEmpty(ip))
        {
            if (ip.IndexOf(",") > 0)
            {
                string[] ipRange = ip.Split(',');
                int le = ipRange.Length - 1;
                ip = ipRange[le];
            }
        } else
        {
            ip = request.UserHostAddress;
        }
    } catch { ip = null; }

    return ip; 
}

Я использовал это в приложении для бритвы с отличными результатами.

Я совершенно новичок в стеке ASP.NET MVC, и мне было интересно, что случилось с простым объектом страницы и объектом Request ServerVariables?

В принципе, я хочу вытащить IP-адрес клиентского ПК, но я не понимаю, как изменилась текущая структура MVC.

Насколько я понимаю, большинство переменных объектов были заменены вариантами HttpRequest .

Кто-нибудь хочет поделиться некоторыми ресурсами? В мире ASP.NET MVC действительно есть масса вещей. :)

Например, у меня есть статический класс с этой текущей функцией. Как получить тот же результат с помощью ASP.NET MVC?

public static int getCountry(Page page)
{
    return getCountryFromIP(getIPAddress(page));
}

public static string getIPAddress(Page page)
{
    string szRemoteAddr = page.Request.ServerVariables["REMOTE_ADDR"];
    string szXForwardedFor = page.Request.ServerVariables["X_FORWARDED_FOR"];
    string szIP = "";

    if (szXForwardedFor == null)
    {
        szIP = szRemoteAddr;
    }
    else
    {
        szIP = szXForwardedFor;

        if (szIP.IndexOf(",") > 0)
        {
            string [] arIPs = szIP.Split(',');

            foreach (string item in arIPs)
            {
                if (!isPrivateIP(item))
                {
                    return item;
                }
            }
        }
    }
    return szIP;
}

И как я могу вызвать эту функцию со страницы контроллера?


Как я объясняю, что мой сайт находится за Amazon AWS Elastic Load Balancer (ELB):

public class GetPublicIp {

    /// <summary>
    /// account for possbility of ELB sheilding the public IP address
    /// </summary>
    /// <returns></returns>
    public static string Execute() {
        try {
            Console.WriteLine(string.Join("|", new List<object> {
                    HttpContext.Current.Request.UserHostAddress,
                    HttpContext.Current.Request.Headers["X-Forwarded-For"],
                    HttpContext.Current.Request.Headers["REMOTE_ADDR"]
                })
            );

            var ip = HttpContext.Current.Request.UserHostAddress;
            if (HttpContext.Current.Request.Headers["X-Forwarded-For"] != null) {
                ip = HttpContext.Current.Request.Headers["X-Forwarded-For"];
                Console.WriteLine(ip + "|X-Forwarded-For");
            }
            else if (HttpContext.Current.Request.Headers["REMOTE_ADDR"] != null) {
                ip = HttpContext.Current.Request.Headers["REMOTE_ADDR"];
                Console.WriteLine(ip + "|REMOTE_ADDR");
            }
            return ip;
        }
        catch (Exception ex) {
            Console.Error.WriteLine(ex.Message);
        }
        return null;
    }
}

Простой ответ заключается в использовании свойства HttpRequest.UserHostAddress .

Пример: изнутри контроллера:

using System;
using System.Web.Mvc;

namespace Mvc.Controllers
{
    public class HomeController : ClientController
    {
        public ActionResult Index()
        {
            string ip = Request.UserHostAddress;

            ...
        }
    }
}

Пример: из класса помощника:

using System.Web;

namespace Mvc.Helpers
{
    public static class HelperClass
    {
        public static string GetIPHelper()
        {
            string ip = HttpContext.Current.Request.UserHostAddress;
            ..
        }
    }
}

НО, если запрос был передан одним или несколькими прокси-серверами, тогда IP-адрес, возвращаемый свойством HttpRequest.UserHostAddress, будет IP-адресом последнего прокси-сервера, который передал запрос.

Прокси-серверы МОГУТ использовать стандарт де-факто размещения IP-адреса клиента в заголовке X-Forwarded-For HTTP. Кроме того, нет гарантии, что запрос имеет заголовок X-Forwarded-For, также нет гарантии, что X-Forwarded-For не был SPOOFED .

Оригинальный ответ

Request.UserHostAddress

Вышеприведенный код обеспечивает IP-адрес клиента, не прибегая к поиску коллекции. Свойство Request доступно в пределах контроллеров (или видов). Поэтому вместо передачи класса страницы вашей функции вы можете передать объект Request, чтобы получить тот же результат:

public static string getIPAddress(HttpRequestBase request)
{
    string szRemoteAddr = request.UserHostAddress;
    string szXForwardedFor = request.ServerVariables["X_FORWARDED_FOR"];
    string szIP = "";

    if (szXForwardedFor == null)
    {
        szIP = szRemoteAddr;
    }
    else
    {
        szIP = szXForwardedFor;
        if (szIP.IndexOf(",") > 0)
        {
            string [] arIPs = szIP.Split(',');

            foreach (string item in arIPs)
            {
                if (!isPrivateIP(item))
                {
                    return item;
                }
            }
        }
    }
    return szIP;
}

У меня возникли проблемы с использованием вышеперечисленного, и мне нужен IP-адрес от контроллера. В конце концов я использовал следующее:

System.Web.HttpContext.Current.Request.UserHostAddress




asp.net-mvc