Heim  >  Fragen und Antworten  >  Hauptteil

Wie erhalte ich die IP-Adresse des Clients in ASP.NET MVC?

Ich bin völlig neu im ASP.NET MVC-Stack und würde gerne wissen, was mit dem einfachen Page-Objekt und dem Request ServerVariables-Objekt los ist.

Grundsätzlich möchte ich die IP-Adresse des Client-PCs extrahieren, kann aber nicht verstehen, wie die aktuelle MVC-Struktur dies ändert.

Soweit ich weiß, wurden die meisten variablen Objekte durch HttpRequest-Varianten ersetzt.

Ist jemand bereit, einige Ressourcen zu teilen? In der Welt von ASP.NET MVC gibt es wirklich eine Menge zu lernen. :)

Zum Beispiel habe ich eine statische Klasse mit einer aktuellen Funktion. Wie kann ich mit ASP.NET MVC die gleichen Ergebnisse erzielen?

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;
}

Wie rufe ich diese Funktion von der Controller-Seite aus auf?

P粉232409069P粉232409069341 Tage vor610

Antworte allen(2)Ich werde antworten

  • P粉826283529

    P粉8262835292023-10-15 00:43:26

    Request.ServerVariables["REMOTE_ADDR"] 应该可以工作 - 直接在视图中或在控制器操作方法主体中(Request 是 MVC 中 Controller 类的属性,而不是 Page)。

    它正在工作..但您必须在真实的​​ IIS 而不是虚拟的 IIS 上发布。

    Antwort
    0
  • P粉903969231

    P粉9039692312023-10-15 00:08:01

    简单的答案是使用 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;
                ..
            }
        }
    }

    但是,如果请求已由一个或多个代理服务器 然后是 HttpRequest.UserHostAddress 返回的 IP 地址property 将是中继请求的最后一个代理服务器的 IP 地址。

    代理服务器可以使用事实上的标准,将客户端的IP地址放置在X-Forwarded-For HTTP 标头。除了不能保证请求具有 X-Forwarded-For 标头之外,也不能保证 X-Forwarded-For 未被 欺骗


    原始答案

    Request.UserHostAddress

    上面的代码提供了客户端的 IP 地址,而无需查找集合。 Request 属性在控制器(或视图)中可用。因此,您可以传递一个 Request 对象来获得相同的结果,而不是将 Page 类传递给您的函数:

    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;
    }

    Antwort
    0
  • StornierenAntwort