Bonjour, j'ai besoin de l'adresse IP du client qui demande une méthode dans l'API Web. J'ai essayé d'utiliser ce code de ici mais il retourne toujours l'adresse IP locale du serveur. Comment obtenir de manière correcte?
HttpContext.Current.Request.UserHostAddress;
d'autres questions:
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;
}
}
Le lien suivant peut vous aider. Voici le code du lien suivant.
référence: obtenir-le-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;
}
}
}
}
Une autre façon de faire est ci-dessous.
référence: comment-accéder-le-client-s-ip-address
Pour la version hébergée sur le Web
string clientAddress = HttpContext.Current.Request.UserHostAddress;
Pour auto-hébergé
object property;
Request.Properties.TryGetValue(typeof(RemoteEndpointMessageProperty).FullName, out property);
RemoteEndpointMessageProperty remoteProperty = property as RemoteEndpointMessageProperty;
Avec Web API 2.2: Request.GetOwinContext().Request.RemoteIpAddress
Essayez d’obtenir l’Ip en utilisant
ip = HttpContext.Current != null ? HttpContext.Current.Request.UserHostAddress : "";
Si vous hébergez vous-même avec Asp.Net 2.1 à l'aide du package OWIN Self-Host NuGet, vous pouvez utiliser le code suivant:
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;
}
Il vaut mieux le lancer dans HttpContextBase
pour pouvoir se moquer et le tester plus facilement.
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;
}
Je pense que c'est la solution la plus claire, utilisant une méthode d'extension:
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;
}
}
Alors utilisez-le simplement comme:
var ipAddress = request.GetClientIpAddress();
Nous l'utilisons dans nos projets.
Source/Référence: Récupération de l’adresse IP du client dans l’API Web ASP.NET
Répondre à ce message de 4 ans, parce que cela me semble trop compliqué, du moins si vous hébergez sur IIS et que ce message est très volumineux sur DuckDuckGo (et probablement NSAoogle) pour "contrôleur d'API Web obtenir IP adresse".
Voici comment je l'ai résolu:
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);
...
Contrairement à l'OP, cela me donne l'adresse IP du client et le nom d'hôte du client, pas le serveur. Peut-être qu'ils ont corrigé le bogue depuis?
Ma solution est similaire à la réponse de user1587439, mais fonctionne directement sur l'instance du contrôleur (au lieu d'accéder à HttpContext.Current).
Dans la fenêtre 'Regarder', j'ai vu que this.RequestContext.WebRequest contenait la propriété 'UserHostAddress', mais puisqu'elle s'appuie sur le type WebHostHttpRequestContext (interne à l'assembly 'System.Web.Http'), ce n'était pas le cas capable d'y accéder directement, j'ai donc utilisé la réflexion pour y accéder directement:
string hostAddress = ((System.Web.HttpRequestWrapper)this.RequestContext.GetType().Assembly.GetType("System.Web.Http.WebHost.WebHostHttpRequestContext").GetProperty("WebRequest").GetMethod.Invoke(this.RequestContext, null)).UserHostAddress;
Je ne dis pas que c'est la meilleure solution. l'utilisation de la réflexion peut poser problème à l'avenir en cas de mise à niveau de la structure (en raison de changements de nom), mais pour mes besoins, c'est parfait