我是ASP.NET MVC堆栈的新手,我想知道简单的Page对象和Request ServerVariables对象发生了什么?

基本上,我想提取客户端PC的IP地址,但是我不明白当前的MVC结构如何改变了所有这些。

据我了解,most of the variable objects has been replaced by the HttpRequest variants

有人愿意分享一些资源吗?在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;
}

以及如何从 Controller 页面调用此函数?

最佳答案

简单的答案是使用HttpRequest.UserHostAddress property

示例:在 Controller 内:

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

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

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

原始答案
Request.UserHostAddress

上面的代码提供了客户端的IP地址,而无需查找集合。 Request属性在Controllers(或Views)中可用。因此,除了将Page类传递给函数外,还可以传递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;
}

关于c# - 如何在ASP.NET MVC中获取客户端的IP地址?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2577496/

10-11 04:38