Asp Net Web API 2.1 получить IP-адрес клиента


112

Здравствуйте, мне нужно получить IP-адрес клиента, который запрашивает какой-либо метод в веб-api, я пытался использовать этот код здесь, но он всегда возвращает локальный IP-адрес сервера, как правильно?

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 или что-то необычное.)
Нейт Барбеттини

здорово признать источник. Отредактировано
Stefano Mtangoo 02 окт.15,

Ответы:


124

Следующая ссылка может вам помочь. Вот код из следующей ссылки.

ссылка: получение-клиента-ip-через-asp-net-web-api

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

Другой способ сделать это - ниже.

ссылка: как-получить-доступ-клиент-s-ip-адрес

Для веб-версии

string clientAddress = HttpContext.Current.Request.UserHostAddress;

Для самостоятельного размещения

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


16

Попробуйте получить IP, используя

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

1
@DenisBabarykin Я думаю, он должен, .. он возвращает IP-адрес в переменной сервера REMOTE_ADDR
user1587439

9

Если вы самостоятельно размещаете Asp.Net 2.1 с помощью пакета NuGet для самостоятельного размещения OWIN, вы можете использовать следующий код:

 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) для «веб-контроллера api получить IP-адрес».

Вот как я это решил:

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, это дает мне IP-адрес клиента и имя хоста клиента, а не сервер. Возможно, с тех пор они исправили ошибку?


Хотел бы увидеть ответ на использование веб-API DotNetCore. Не могу поверить, что делать что-то настолько элементарное - это сложно.
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
Я погуглил, и другие, похоже, согласны с этим (приведено к HttpContextBase вместо HttpContextWrapper, потому что 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();

Мы используем это в наших проектах.

Источник / ссылка: получение IP-адреса клиента в веб-API ASP.NET


2

Мое решение похоже на ответ user1587439, но работает непосредственно с экземпляром контроллера (вместо доступа к HttpContext.Current).

В окне 'Watch' я увидел, что this.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 и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.