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