एस्प नेट वेब एपीआई 2.1 को क्लाइंट आईपी एड्रेस मिलता है


112

नमस्कार मुझे क्लाइंट आईपी प्राप्त करने की आवश्यकता है जो वेब एपीआई में कुछ विधि का अनुरोध करता है, मैंने यहां से इस कोड का उपयोग करने की कोशिश की है लेकिन यह हमेशा सर्वर स्थानीय आईपी देता है, सही तरीके से कैसे प्राप्त करें?

HttpContext.Current.Request.UserHostAddress;

अन्य प्रश्नों से:

public static class HttpRequestMessageExtensions
    {
        private const string HttpContext = "MS_HttpContext";
        private const string RemoteEndpointMessage = "System.ServiceModel.Channels.RemoteEndpointMessageProperty";

        public static string GetClientIpAddress(this HttpRequestMessage request)
        {
            if (request.Properties.ContainsKey(HttpContext))
            {
                dynamic ctx = request.Properties[HttpContext];
                if (ctx != null)
                {
                    return ctx.Request.UserHostAddress;
                }
            }

            if (request.Properties.ContainsKey(RemoteEndpointMessage))
            {
                dynamic remoteEndpoint = request.Properties[RemoteEndpointMessage];
                if (remoteEndpoint != null)
                {
                    return remoteEndpoint.Address;
                }
            }

            return null;
        }
    }

यह विस्तार विधि मेरे लिए अच्छा काम करती है। (मैं OWIN या कुछ भी असामान्य का उपयोग नहीं कर रहा हूं।)
नैट बारबेटिनी

स्रोत को स्वीकार करने के लिए अच्छा है। सम्पादित
स्टेफानो मैंटांगू

जवाबों:


124

निम्नलिखित लिंक आपकी मदद कर सकते हैं। यहां नीचे दिए गए लिंक से कोड दिया गया है।

संदर्भ: क्लाइंट-आईपी-थ्रू-एस्प-नेट-वेब-एपीआई प्राप्त करना

using System.Net.Http;
using System.ServiceModel.Channels;
using System.Web;
using System.Web.Http;


namespace Trikks.Controllers.Api
{
    public class IpController : ApiController
    {
          public string GetIp()
          {
                return GetClientIp();
          }

          private string GetClientIp(HttpRequestMessage request = null)
          {
                request = request ?? Request;

                if (request.Properties.ContainsKey("MS_HttpContext"))
                {
                      return   ((HttpContextWrapper)request.Properties["MS_HttpContext"]).Request.UserHostAddress;
                }
                else if (request.Properties.ContainsKey(RemoteEndpointMessageProperty.Name))
                {
                     RemoteEndpointMessageProperty prop = (RemoteEndpointMessageProperty)request.Properties[RemoteEndpointMessageProperty.Name];
                     return prop.Address;
                }
                else if (HttpContext.Current != null)
                {
                    return HttpContext.Current.Request.UserHostAddress;
                }
                else
                {
                      return null;
                }
           }
     }
}

ऐसा करने का एक और तरीका नीचे है।

संदर्भ: कैसे करने के लिए उपयोग- the- क्लाइंट-एस-आईपी-पता

वेब होस्ट किए गए संस्करण के लिए

string clientAddress = HttpContext.Current.Request.UserHostAddress;

स्वयं की मेजबानी के लिए

object property;
        Request.Properties.TryGetValue(typeof(RemoteEndpointMessageProperty).FullName, out property);
        RemoteEndpointMessageProperty remoteProperty = property as RemoteEndpointMessageProperty;


16

आईपी ​​का उपयोग करने की कोशिश करो

ip = HttpContext.Current != null ? HttpContext.Current.Request.UserHostAddress : "";

1
@DenisBabarykin मुझे लगता है कि यह चाहिए, .. यह सर्वर वैरिएबल REMOTE_ADDR में IP पता लौटाता है
user1587439

9

यदि आप OWIN स्व-मेजबान NuGet पैकेज का उपयोग करके Asp.Net 2.1 के साथ स्वयं-होस्टिंग कर रहे हैं, तो आप निम्नलिखित कोड का उपयोग कर सकते हैं:

 private string getClientIp(HttpRequestMessage request = null)
    {
        if (request == null)
        {
            return null;
        }

        if (request.Properties.ContainsKey("MS_OwinContext"))
        {
            return ((OwinContext) request.Properties["MS_OwinContext"]).Request.RemoteIpAddress;
        }
        return null;
    }

7

इस 4 साल पुरानी पोस्ट का जवाब देना, क्योंकि यह मेरे लिए अतिविशिष्ट लगता है, कम से कम यदि आप IIS पर होस्ट कर रहे हैं और यह पोस्ट "वेब एपीआई नियंत्रक को आईपी एड्रेस मिलता है" के लिए DuckDuckGo (और शायद NSAoogle) पर बहुत अधिक है।

यहां बताया गया है कि मैंने इसे कैसे हल किया:

using System;
using System.Net;
using System.Web;
using System.Web.Http;
...
[HttpPost]
[Route("ContactForm")]
public IHttpActionResult PostContactForm([FromBody] ContactForm contactForm)
    {
        var hostname = HttpContext.Current.Request.UserHostAddress;
        IPAddress ipAddress = IPAddress.Parse(hostname);
        IPHostEntry ipHostEntry = Dns.GetHostEntry(ipAddress);
        ...

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


डॉटनेटकोर वेब एपीआई का उपयोग करने के लिए एक उत्तर देखना पसंद करेंगे। मुझे विश्वास नहीं हो रहा है कि कुछ ऐसा करना बहुत कठिन है।
MC9000

5

इसे डालना बेहतर है HttpContextBase, इस तरह से आप इसका और अधिक आसानी से परीक्षण कर सकते हैं

public string GetUserIp(HttpRequestMessage request)
{
    if (request.Properties.ContainsKey("MS_HttpContext"))
    {
        var ctx = request.Properties["MS_HttpContext"] as HttpContextBase;
        if (ctx != null)
        {
            return ctx.Request.UserHostAddress;
        }
    }

    return null;
}

1
मैं आसपास googled और अन्य लोगों को इस के साथ सहमत करने लगते हैं (HttpContextWrapper क्योंकि HttpContextBase उपहास करने के लिए आसान है के बजाय HttpContextBase लिए डाली।)
डेव क्लॉसन

4

मुझे लगता है कि यह एक एक्सटेंशन विधि का उपयोग करके सबसे स्पष्ट समाधान है:

public static class HttpRequestMessageExtensions
{
    private const string HttpContext = "MS_HttpContext";
    private const string RemoteEndpointMessage = "System.ServiceModel.Channels.RemoteEndpointMessageProperty";

    public static string GetClientIpAddress(this HttpRequestMessage request)
    {
        if (request.Properties.ContainsKey(HttpContext))
        {
            dynamic ctx = request.Properties[HttpContext];
            if (ctx != null)
            {
                return ctx.Request.UserHostAddress;
            }
        }

        if (request.Properties.ContainsKey(RemoteEndpointMessage))
        {
            dynamic remoteEndpoint = request.Properties[RemoteEndpointMessage];
            if (remoteEndpoint != null)
            {
                return remoteEndpoint.Address;
            }
        }

        return null;
    }
}

तो बस इसका उपयोग करें:

var ipAddress = request.GetClientIpAddress();

हम इसका उपयोग अपनी परियोजनाओं में करते हैं।

स्रोत / संदर्भ: ASP.NET वेब एपीआई में ग्राहक के आईपी पते को पुनः प्राप्त करना


2

मेरा समाधान user1587439 के उत्तर के समान है, लेकिन सीधे नियंत्रक के उदाहरण (HttpContext.Current पर पहुंचने के बजाय) पर काम करता है।

'वॉच' विंडो में, मैंने देखा कि यह। RequestContext.WebRequest में 'UserHostAddress' गुण है, लेकिन चूंकि यह WebHostHttpRequestContext प्रकार पर निर्भर करता है (जो कि 'System.Web.Http' असेंबली में आंतरिक है) - मैं नहीं था इसे सीधे एक्सेस करने में सक्षम, इसलिए मैंने इसे सीधे एक्सेस करने के लिए प्रतिबिंब का उपयोग किया:

string hostAddress = ((System.Web.HttpRequestWrapper)this.RequestContext.GetType().Assembly.GetType("System.Web.Http.WebHost.WebHostHttpRequestContext").GetProperty("WebRequest").GetMethod.Invoke(this.RequestContext, null)).UserHostAddress;

मैं यह नहीं कह रहा हूं कि यह सबसे अच्छा समाधान है। भविष्य में फ्रेमवर्क अपग्रेड (नाम परिवर्तन के कारण) के मामले में प्रतिबिंब का उपयोग करने से समस्या हो सकती है, लेकिन मेरी आवश्यकताओं के लिए यह बिल्कुल सही है


0
string userRequest = System.Web.HttpContext.Current.Request.UserHostAddress;

यह मुझ पर काम करता है।

System.Web.HttpContext.Current.Request.UserHostName;यह मुझे वही रिटर्न देता है जो मुझे मिलता है UserHostAddress

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.