我对ASP完全不熟悉。NET MVC堆栈,我想知道发生了什么简单的页面对象和请求ServerVariables对象?

基本上,我想拉出客户端PC的IP地址,但我不明白当前的MVC结构如何改变了这一切。

据我所知,大多数变量对象已经被HttpRequest变量所取代。

有人愿意分享一些资源吗?在ASP中有很多东西可以学习。NET MVC世界。:)

例如,我有一个带有当前函数的静态类。我如何得到相同的结果使用ASP。净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;
}

我如何从控制器页面调用这个函数?


当前回答

简单的答案是使用HttpRequest。UserHostAddress财产。

示例:从控制器内部:

using System;
using System.Web.Mvc;

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

            ...
        }
    }
}

示例:从helper类中:

using System.Web;

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

但是,如果请求已经通过一个或多个代理服务器传递,则HttpRequest返回的IP地址。UserHostAddress属性将是中继请求的最后一个代理服务器的IP地址。

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


原来的答案

Request.UserHostAddress

上面的代码提供了Client的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;
}

其他回答

简单的答案是使用HttpRequest。UserHostAddress财产。

示例:从控制器内部:

using System;
using System.Web.Mvc;

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

            ...
        }
    }
}

示例:从helper类中:

using System.Web;

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

但是,如果请求已经通过一个或多个代理服务器传递,则HttpRequest返回的IP地址。UserHostAddress属性将是中继请求的最后一个代理服务器的IP地址。

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


原来的答案

Request.UserHostAddress

上面的代码提供了Client的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;
}

我在使用上面的方法时遇到了麻烦,我需要控制器上的IP地址。最后我使用了以下方法:

System.Web.HttpContext.Current.Request.UserHostAddress

我如何解释我的网站背后的亚马逊AWS弹性负载均衡器(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;
    }
}

在一个类中,你可以这样称呼它:

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

我在一个剃须刀应用程序中使用了这个方法,效果很好。

请求。ServerVariables["REMOTE_ADDR"]应该工作-要么直接在视图中,要么在控制器动作方法体中(Request是MVC中controller类的属性,而不是Page)。

它正在工作…但是你必须在真实的IIS上发布,而不是虚拟的IIS。