Heim > Fragen und Antworten > Hauptteil
Ich bin völlig neu im ASP.NET MVC-Stack und würde gerne wissen, was mit dem einfachen Page-Objekt und dem Request ServerVariables-Objekt los ist.
Grundsätzlich möchte ich die IP-Adresse des Client-PCs extrahieren, kann aber nicht verstehen, wie die aktuelle MVC-Struktur dies ändert.
Soweit ich weiß, wurden die meisten variablen Objekte durch HttpRequest-Varianten ersetzt.
Ist jemand bereit, einige Ressourcen zu teilen? In der Welt von ASP.NET MVC gibt es wirklich eine Menge zu lernen. :)
Zum Beispiel habe ich eine statische Klasse mit einer aktuellen Funktion. Wie kann ich mit ASP.NET MVC die gleichen Ergebnisse erzielen?
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; }
Wie rufe ich diese Funktion von der Controller-Seite aus auf?
P粉8262835292023-10-15 00:43:26
Request.ServerVariables["REMOTE_ADDR"]
应该可以工作 - 直接在视图中或在控制器操作方法主体中(Request 是 MVC 中 Controller 类的属性,而不是 Page)。 p>
它正在工作..但您必须在真实的 IIS 而不是虚拟的 IIS 上发布。
P粉9039692312023-10-15 00:08:01
简单的答案是使用 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 地址property 将是中继请求的最后一个代理服务器的 IP 地址。
代理服务器可以使用事实上的标准,将客户端的IP地址放置在X-Forwarded-For HTTP 标头。除了不能保证请求具有 X-Forwarded-For 标头之外,也不能保证 X-Forwarded-For 未被 欺骗。
原始答案
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; }