小编典典

如何在 ASP.NET MVC 中获取客户端的 IP 地址?

all

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

以及如何从控制器页面调用此函数?


阅读 80

收藏
2022-04-08

共1个答案

小编典典

简单的答案是使用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
地址将是最后一个中继请求的代理服务器的 IP 地址。

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


原始答案

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;
}
2022-04-08