Asp Net Web API 2.1 istemci IP adresini al


112

Merhaba, web api'de bir yöntem isteyen istemci IP'sine ihtiyacım var, bu kodu buradan kullanmayı denedim ama her zaman sunucu yerel IP'sini döndürüyor, nasıl doğru şekilde alınır?

HttpContext.Current.Request.UserHostAddress;

diğer sorulardan:

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

Bu uzatma yöntemi benim için iyi çalışıyor. (OWIN veya olağandışı bir şey kullanmıyorum.)
Nate Barbettini

kaynağı kabul etmek harika. Düzenlendi
Stefano Mtangoo

Yanıtlar:


124

Aşağıdaki bağlantı size yardımcı olabilir. İşte aşağıdaki bağlantıdan kod.

başvuru: asp-net-web-api yoluyla istemci-ip-alma

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

Bunu yapmanın başka bir yolu aşağıdadır.

başvuru: istemci-s-ip-adresine nasıl-erişilir

Web'de barındırılan sürüm için

string clientAddress = HttpContext.Current.Request.UserHostAddress;

Kendi kendine barındırılanlar için

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


16

Kullanarak ip almaya çalışın

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

1
@DenisBabarykin Bence olmalı, .. REMOTE_ADDR sunucu değişkenindeki IP adresini döndürüyor
user1587439

9

OWIN Self-host NuGet paketini kullanarak Asp.Net 2.1 ile kendi kendine barındırıyorsanız, aşağıdaki kodu kullanabilirsiniz:

 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

Bu 4 yıllık gönderiyi yanıtlıyorum, çünkü bu benim için fazla karmaşık görünüyor, en azından IIS'de barındırıyorsanız ve bu gönderi DuckDuckGo'da (ve muhtemelen NSAoogle'da) "web api denetleyicisi IP adresi al" için çok yüksekse.

İşte bunu nasıl çözdüm:

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);
        ...

OP'nin aksine, bu bana sunucuyu değil, istemci IP'sini ve istemci ana bilgisayar adını verir. Belki o zamandan beri hatayı düzelttiler?


DotNetCore web API kullanımı için bir cevap görmek isterim. Bu kadar ilkel bir şey yapmanın bu kadar zor olduğuna inanamıyorum.
MC9000

5

Onu yayınlamak daha iyidir HttpContextBase, bu şekilde alay edebilir ve daha kolay test edebilirsiniz.

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
Googledim ve diğerleri bununla aynı fikirde görünüyor (HttpContextWrapper yerine HttpContextBase'e atıldı çünkü HttpContextBase ile alay etmek daha kolay.)
Dave Clausen

4

Bir uzatma yöntemi kullanarak bunun en net çözüm olduğunu düşünüyorum:

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

Öyleyse şu şekilde kullanın:

var ipAddress = request.GetClientIpAddress();

Bunu projelerimizde kullanıyoruz.

Kaynak / Referans: İstemcinin IP adresini ASP.NET Web API'de alma


2

Çözümüm user1587439'un cevabına benzer, ancak doğrudan denetleyicinin örneğinde çalışır (HttpContext.Current'a erişmek yerine).

'İzle' penceresinde, this.RequestContext.WebRequest'in 'UserHostAddress' özelliğini içerdiğini, ancak WebHostHttpRequestContext türüne ('System.Web.Http' derlemesine dahil olduğu için) dayandığını gördüm - Ben değildim doğrudan erişebildi, bu yüzden doğrudan erişmek için yansıma kullandım:

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

Bunun en iyi çözüm olduğunu söylemiyorum. yansıma kullanmak, gelecekte çerçeve yükseltmesi durumunda sorunlara neden olabilir (ad değişiklikleri nedeniyle), ancak ihtiyaçlarım için mükemmel


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

Bu bende işe yarıyor.

System.Web.HttpContext.Current.Request.UserHostName;bu bana aynı dönüşü geri getiriyor UserHostAddress.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.