搜尋

首頁  >  問答  >  主體

取得客戶端的IP位址在ASP.NET MVC中的方法是什麼?

我對 ASP.NET MVC 堆疊完全陌生,我想知道簡單的 Page 物件和 Request ServerVariables 物件發生了什麼?

基本上,我想提取客戶端 PC 的 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;
}

如何從控制器頁面呼叫此函數?

P粉232409069P粉232409069456 天前721

全部回覆(2)我來回復

  • P粉826283529

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

    Request.ServerVariables["REMOTE_ADDR"] 應該可以工作 - 直接在視圖中或在控制器操作方法主體中(Request 是 MVC 中 Controller 類別的屬性,而不是 Page)。

    它正在工作..但您必須在真實的 IIS 而不是虛擬的 IIS 上發布。

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

    回覆
    0
  • 取消回覆