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
.