我对 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; }
以及如何从控制器页面调用此函数?
简单的答案是使用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; }