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

Здравствуйте, мне нужно получить 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;
        }
    }

Ответ 1

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

ссылка: получение-клиента-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;

Ответ 2

С Web API 2.2: Request.GetOwinContext().Request.RemoteIpAddress

Ответ 3

Попробуйте использовать Ip, используя

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

Ответ 4

Если вы являетесь владельцем собственного хостинга с 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;
    }

Ответ 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;
}

Ответ 6

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

Ответ 7

Я думаю, что это наиболее четкое решение, используя метод расширения:

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

Ответ 8

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

В окне "Смотреть" я увидел, что 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;

Я не считаю это лучшим решением. использование рефлексии может вызвать проблемы в будущем в случае обновления фреймворка (из-за изменений имени), но для моих потребностей он идеален

Ответ 9

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

Это работает на меня.

System.Web.HttpContext.Current.Request.UserHostName; этот возвращает мне то же самое, что я получаю от UserHostAddress.