दिलचस्प पोस्ट
एक्सेल VBA में, मैं उपयोगकर्ता-निर्धारित फ़िल्टर को कैसे सहेज / पुनर्स्थापित करूं? Laravel के ब्लेड: मैं एक टेम्पलेट में कैसे चर सेट कर सकते हैं? एक एल्गोरिथ्म को अतिव्यापी आयताकारों से बाहर स्थान? क्या यह नामस्थान ब्लॉक में # शामिल करने के लिए एक अच्छा विचार है? मैं ऑवैइडटाबलऑब्जेक्ट का उपयोग कैसे करूं? घटनाओं के बाहर माउस की स्थिति का निर्धारण (jQuery का उपयोग करना)? कैसे आईओएस एसडीके में एक छाता ढांचा बनाने के लिए? नॉनस्टैटिक सदस्य को एक गैर-स्थायी सदस्य कार्य के एक डिफ़ॉल्ट तर्क के रूप में फाटप्लीब के साथ डायरेक्टरी ट्री डाउनलोड करना फ्रीटाइट्स के साथ एमबीआरओआरए आवाज़ – विंडोज़ स्थिर स्मृति में सी ++ में एक स्ट्रिंग शब्दशः है? सी # और यूएसबी छुपाया उपकरण प्रतिबिंब कार्यों के लिए एक .NET विधानसभा को कैसे लोड करें और बाद में इसे अनलोड करें? कोड से वैश्विक टिंट रंग प्राप्त करें मैं एक रेगेक्स कैसे लिख सकता हूं जो गैर लालची से मेल खाता है?

मैं एएसपी.नेट एमवीसी में क्लाइंट का आईपी पता कैसे प्राप्त करूं?

मैं एएसपी.नेट एमवीसी स्टैक के लिए पूरी तरह से नया हूँ, और मैं सोच रहा था कि सरल पेज ऑब्जेक्ट और अनुरोध सर्वर वर्इबेट्स ऑब्जेक्ट का क्या हुआ?

मूल रूप से, मैं क्लाइंट पीसी के आईपी पते को बाहर निकालना चाहता हूं, लेकिन मुझे यह समझने में विफल रहता है कि वर्तमान एमवीसी संरचना इस सब में कैसे बदल गई है।

जहां तक ​​मैं समझ सकता हूँ, अधिकांश चर ऑब्जेक्ट्स को HttpRequest वेरिएंट्स द्वारा बदल दिया गया है ।

कुछ संसाधनों को साझा करने के लिए कोई भी देखभाल करता है? एएसपी.नेट एमवीसी विश्व में जानने के लिए वास्तव में सामान का एक समुद्र है। 🙂

उदाहरण के लिए, मेरे पास इस वर्तमान फ़ंक्शन के साथ एक स्थिर वर्ग है। मैं एएसपी.नेट एमवीसी का उपयोग कर एक ही परिणाम कैसे प्राप्त करूं?

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

और मैं इस फ़ंक्शन को नियंत्रक पृष्ठ से कैसे कॉल करूं?

Solutions Collecting From Web of "मैं एएसपी.नेट एमवीसी में क्लाइंट का आईपी पता कैसे प्राप्त करूं?"

सरल जवाब 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; .. } } } 

परन्तु, यदि अनुरोध एक या अधिक के द्वारा पारित किया गया है, तो प्रॉक्सी सर्वर तब एचटीटीपीएंडईस्ट। यूज़रहोस्टएड्रेस प्रॉपर्टी द्वारा लौटाए गए आईपी एड्रेस अंतिम प्रोक्सी सर्वर का आईपी एड्रेस होगा जो अनुरोध रिलेयर करता है।

प्रॉक्सी सर्वर एक्स-फॉरवर्ड किए गए- HTTP शीर्षलेख में ग्राहक के आईपी पते को रखने के वास्तविक मानक का उपयोग कर सकते हैं। एक तरफ से कोई गारंटी नहीं है कि एक अनुरोध के लिए एक्स-फॉरवर्ड-हेडर है, इसमें कोई गारंटी नहीं है कि X- अग्रेषित-के लिए SPOOFED नहीं किया गया है।


मूल उत्तर

 Request.UserHostAddress 

उपरोक्त कोड एक संग्रह को देखने के लिए बिना ग्राहक के आईपी पते प्रदान करता है। अनुरोध संपत्ति नियंत्रक (या दृश्य) के भीतर उपलब्ध है। इसलिए अपने फ़ंक्शन को पेज क्लास देने के बजाय आप एक ही परिणाम प्राप्त करने के लिए एक अनुरोध ऑब्जेक्ट पास कर सकते हैं:

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

अनुरोध। Request.ServerVariables["REMOTE_ADDR"] काम करना चाहिए – या तो सीधे किसी दृश्य में या नियंत्रक क्रिया विधि निकाय में (अनुरोध एमवीसी में, नियंत्रक वर्ग की कोई संपत्ति नहीं, पृष्ठ है)।

यह काम कर रहा है .. लेकिन आपको असली आईआईएस पर वर्चुअल एक नहीं प्रकाशित करना है

यहां बहुत सारे कोड बहुत उपयोगी थे, लेकिन मैंने इसे अपने उद्देश्यों के लिए साफ़ कर दिया और कुछ परीक्षण जोड़े। यहां बताया गया है कि:

 using System; using System.Linq; using System.Net; using System.Web; public class RequestHelpers { public static string GetClientIpAddress(HttpRequestBase request) { try { var userHostAddress = request.UserHostAddress; // Attempt to parse. If it fails, we catch below and return "0.0.0.0" // Could use TryParse instead, but I wanted to catch all exceptions IPAddress.Parse(userHostAddress); var xForwardedFor = request.ServerVariables["X_FORWARDED_FOR"]; if (string.IsNullOrEmpty(xForwardedFor)) return userHostAddress; // Get a list of public ip addresses in the X_FORWARDED_FOR variable var publicForwardingIps = xForwardedFor.Split(',').Where(ip => !IsPrivateIpAddress(ip)).ToList(); // If we found any, return the last one, otherwise return the user host address return publicForwardingIps.Any() ? publicForwardingIps.Last() : userHostAddress; } catch (Exception) { // Always return all zeroes for any failure (my calling code expects it) return "0.0.0.0"; } } private static bool IsPrivateIpAddress(string ipAddress) { // http://en.wikipedia.org/wiki/Private_network // Private IP Addresses are: // 24-bit block: 10.0.0.0 through 10.255.255.255 // 20-bit block: 172.16.0.0 through 172.31.255.255 // 16-bit block: 192.168.0.0 through 192.168.255.255 // Link-local addresses: 169.254.0.0 through 169.254.255.255 (http://en.wikipedia.org/wiki/Link-local_address) var ip = IPAddress.Parse(ipAddress); var octets = ip.GetAddressBytes(); var is24BitBlock = octets[0] == 10; if (is24BitBlock) return true; // Return to prevent further processing var is20BitBlock = octets[0] == 172 && octets[1] >= 16 && octets[1] <= 31; if (is20BitBlock) return true; // Return to prevent further processing var is16BitBlock = octets[0] == 192 && octets[1] == 168; if (is16BitBlock) return true; // Return to prevent further processing var isLinkLocalAddress = octets[0] == 169 && octets[1] == 254; return isLinkLocalAddress; } } 

और यहां उस कोड के खिलाफ कुछ एनयूनिट टेस्ट दिए गए हैं (मैं राइनो मोक्स को एचटीटीपीएक्वेस्टबेस को नकली करने के लिए उपयोग कर रहा हूं, जो एम <HttpRequestBase> नीचे कॉल करता है):

 using System.Web; using NUnit.Framework; using Rhino.Mocks; using Should; [TestFixture] public class HelpersTests : TestBase { HttpRequestBase _httpRequest; private const string XForwardedFor = "X_FORWARDED_FOR"; private const string MalformedIpAddress = "MALFORMED"; private const string DefaultIpAddress = "0.0.0.0"; private const string GoogleIpAddress = "74.125.224.224"; private const string MicrosoftIpAddress = "65.55.58.201"; private const string Private24Bit = "10.0.0.0"; private const string Private20Bit = "172.16.0.0"; private const string Private16Bit = "192.168.0.0"; private const string PrivateLinkLocal = "169.254.0.0"; [SetUp] public void Setup() { _httpRequest = M<HttpRequestBase>(); } [TearDown] public void Teardown() { _httpRequest = null; } [Test] public void PublicIpAndNullXForwardedFor_Returns_CorrectIp() { // Arrange _httpRequest.Stub(x => x.UserHostAddress).Return(GoogleIpAddress); _httpRequest.Stub(x => x.ServerVariables[XForwardedFor]).Return(null); // Act var ip = RequestHelpers.GetClientIpAddress(_httpRequest); // Assert ip.ShouldEqual(GoogleIpAddress); } [Test] public void PublicIpAndEmptyXForwardedFor_Returns_CorrectIp() { // Arrange _httpRequest.Stub(x => x.UserHostAddress).Return(GoogleIpAddress); _httpRequest.Stub(x => x.ServerVariables[XForwardedFor]).Return(string.Empty); // Act var ip = RequestHelpers.GetClientIpAddress(_httpRequest); // Assert ip.ShouldEqual(GoogleIpAddress); } [Test] public void MalformedUserHostAddress_Returns_DefaultIpAddress() { // Arrange _httpRequest.Stub(x => x.UserHostAddress).Return(MalformedIpAddress); _httpRequest.Stub(x => x.ServerVariables[XForwardedFor]).Return(null); // Act var ip = RequestHelpers.GetClientIpAddress(_httpRequest); // Assert ip.ShouldEqual(DefaultIpAddress); } [Test] public void MalformedXForwardedFor_Returns_DefaultIpAddress() { // Arrange _httpRequest.Stub(x => x.UserHostAddress).Return(GoogleIpAddress); _httpRequest.Stub(x => x.ServerVariables[XForwardedFor]).Return(MalformedIpAddress); // Act var ip = RequestHelpers.GetClientIpAddress(_httpRequest); // Assert ip.ShouldEqual(DefaultIpAddress); } [Test] public void SingleValidPublicXForwardedFor_Returns_XForwardedFor() { // Arrange _httpRequest.Stub(x => x.UserHostAddress).Return(GoogleIpAddress); _httpRequest.Stub(x => x.ServerVariables[XForwardedFor]).Return(MicrosoftIpAddress); // Act var ip = RequestHelpers.GetClientIpAddress(_httpRequest); // Assert ip.ShouldEqual(MicrosoftIpAddress); } [Test] public void MultipleValidPublicXForwardedFor_Returns_LastXForwardedFor() { // Arrange _httpRequest.Stub(x => x.UserHostAddress).Return(GoogleIpAddress); _httpRequest.Stub(x => x.ServerVariables[XForwardedFor]).Return(GoogleIpAddress + "," + MicrosoftIpAddress); // Act var ip = RequestHelpers.GetClientIpAddress(_httpRequest); // Assert ip.ShouldEqual(MicrosoftIpAddress); } [Test] public void SinglePrivateXForwardedFor_Returns_UserHostAddress() { // Arrange _httpRequest.Stub(x => x.UserHostAddress).Return(GoogleIpAddress); _httpRequest.Stub(x => x.ServerVariables[XForwardedFor]).Return(Private24Bit); // Act var ip = RequestHelpers.GetClientIpAddress(_httpRequest); // Assert ip.ShouldEqual(GoogleIpAddress); } [Test] public void MultiplePrivateXForwardedFor_Returns_UserHostAddress() { // Arrange _httpRequest.Stub(x => x.UserHostAddress).Return(GoogleIpAddress); const string privateIpList = Private24Bit + "," + Private20Bit + "," + Private16Bit + "," + PrivateLinkLocal; _httpRequest.Stub(x => x.ServerVariables[XForwardedFor]).Return(privateIpList); // Act var ip = RequestHelpers.GetClientIpAddress(_httpRequest); // Assert ip.ShouldEqual(GoogleIpAddress); } [Test] public void MultiplePublicXForwardedForWithPrivateLast_Returns_LastPublic() { // Arrange _httpRequest.Stub(x => x.UserHostAddress).Return(GoogleIpAddress); const string privateIpList = Private24Bit + "," + Private20Bit + "," + MicrosoftIpAddress + "," + PrivateLinkLocal; _httpRequest.Stub(x => x.ServerVariables[XForwardedFor]).Return(privateIpList); // Act var ip = RequestHelpers.GetClientIpAddress(_httpRequest); // Assert ip.ShouldEqual(MicrosoftIpAddress); } } 

मुझे ऊपर का उपयोग करने में परेशानी थी, और मुझे एक नियंत्रक से आईपी पते की आवश्यकता थी। मैंने अंत में निम्नलिखित का इस्तेमाल किया:

 System.Web.HttpContext.Current.Request.UserHostAddress 

एक कक्षा में आप इसे इस तरह से कह सकते हैं:

 public static string GetIPAddress(HttpRequestBase request) { string ip; try { ip = request.ServerVariables["HTTP_X_FORWARDED_FOR"]; if (!string.IsNullOrEmpty(ip)) { if (ip.IndexOf(",") > 0) { string[] ipRange = ip.Split(','); int le = ipRange.Length - 1; ip = ipRange[le]; } } else { ip = request.UserHostAddress; } } catch { ip = null; } return ip; } 

मैंने बहुत अच्छे परिणाम के साथ एक रेजर ऐप में इसका इस्तेमाल किया था

मैं अपनी साइट के लिए एक अमेज़ॅन एडब्ल्यूएस लोस्टिक लोड बैलेंसर (ईएलबी) के पीछे कैसे खाता हूं:

 public class GetPublicIp { /// <summary> /// account for possbility of ELB sheilding the public IP address /// </summary> /// <returns></returns> public static string Execute() { try { Console.WriteLine(string.Join("|", new List<object> { HttpContext.Current.Request.UserHostAddress, HttpContext.Current.Request.Headers["X-Forwarded-For"], HttpContext.Current.Request.Headers["REMOTE_ADDR"] }) ); var ip = HttpContext.Current.Request.UserHostAddress; if (HttpContext.Current.Request.Headers["X-Forwarded-For"] != null) { ip = HttpContext.Current.Request.Headers["X-Forwarded-For"]; Console.WriteLine(ip + "|X-Forwarded-For"); } else if (HttpContext.Current.Request.Headers["REMOTE_ADDR"] != null) { ip = HttpContext.Current.Request.Headers["REMOTE_ADDR"]; Console.WriteLine(ip + "|REMOTE_ADDR"); } return ip; } catch (Exception ex) { Console.Error.WriteLine(ex.Message); } return null; } }