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 або щось незвичне.)
Nate Barbettini

велике визнання джерела. Відредаговано
Стефано Мтангу

Відповіді:


124

Наступне посилання може допомогти вам. Ось код за наступним посиланням.

довідка: get-the-client-ip-via-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
користувач1587439

9

Якщо ви самостійно розміщуєте хостинг за допомогою Asp.Net 2.1, використовуючи пакет OGIN Self-host NuGet, ви можете використовувати такий код:

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

У вікні "Дивитися" я побачив, що 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.