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?
Request.ServerVariables["REMOTE_ADDR"]
應(yīng)該可以工作 - 直接在視圖中或在控制器操作方法主體中(Request 是 MVC 中 Controller 類的屬性,而不是 Page)。 p>
它正在工作..但您必須在真實的?? IIS 而不是虛擬的 IIS 上發(fā)布。
簡單的答案是使用 HttpRequest.UserHostAddress 屬性。
示例:從控制器內(nèi)部:
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; .. } } }
但是,如果請求已由一個或多個代理服務(wù)器傳遞> 然后是 HttpRequest.UserHostAddress 返回的 IP 地址property 將是中繼請求的最后一個代理服務(wù)器的 IP 地址。
代理服務(wù)器可以使用事實上的標(biāo)準(zhǔn),將客戶端的IP地址放置在X-Forwarded-For HTTP 標(biāo)頭。除了不能保證請求具有 X-Forwarded-For 標(biāo)頭之外,也不能保證 X-Forwarded-For 未被 欺騙。
原始答案
Request.UserHostAddress
上面的代碼提供了客戶端的 IP 地址,而無需查找集合。 Request 屬性在控制器(或視圖)中可用。因此,您可以傳遞一個 Request 對象來獲得相同的結(jié)果,而不是將 Page 類傳遞給您的函數(shù):
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; }