146 votes

Obtenir l’adresse IP de l’hôte distant

Dans ASP.NET, il y a un classe qui contient les biens qui peuvent nous fournir l’adresse IP adresse de `` valeur de la propriété.

Cependant, je ne pouvais pas trouver un moyen similaire pour obtenir l’adresse IP de l’hôte distant à partir d’ASP.NET Web API.

Comment puis-je obtenir l’adresse IP de l’hôte distant qui fait la demande ?

205voto

carlosfigueira Points 40778

Il est possible de le faire, mais pas très détectable - vous devrez utiliser le sac de propriétés de la requête entrante et la propriété, à que vous devez accéder dépend de si vous utilisez l’API Web sous IIS (hébergé sur le Web) ou auto-hébergé. Le code ci-dessous illustre comment cela peut être fait.

78voto

Nikolai Samteladze Points 1759

Cette solution couvre également l'API Web auto-hébergé à l'aide de Owin. Partiellement à partir d' ici.

Vous pouvez créer une méthode privée en vous - ApiController qui sera de retour l'adresse IP distante, peu importe comment vous hébergez votre site Web API:

 private const string HttpContext = "MS_HttpContext";
 private const string RemoteEndpointMessage =
     "System.ServiceModel.Channels.RemoteEndpointMessageProperty";
 private const string OwinContext = "MS_OwinContext";

 private string GetClientIp(HttpRequestMessage request)
 {
       // Web-hosting
       if (request.Properties.ContainsKey(HttpContext ))
       {
            HttpContextWrapper ctx = 
                (HttpContextWrapper)request.Properties[HttpContext];
            if (ctx != null)
            {
                return ctx.Request.UserHostAddress;
            }
       }

       // Self-hosting
       if (request.Properties.ContainsKey(RemoteEndpointMessage))
       {
            RemoteEndpointMessageProperty remoteEndpoint =
                (RemoteEndpointMessageProperty)request.Properties[RemoteEndpointMessage];
            if (remoteEndpoint != null)
            {
                return remoteEndpoint.Address;
            }
        }

       // Self-hosting using Owin
       if (request.Properties.ContainsKey(OwinContext))
       {
           OwinContext owinContext = (OwinContext)request.Properties[OwinContext];
           if (owinContext != null)
           {
               return owinContext.Request.RemoteIpAddress;
           }
       }

        return null;
 }

Références requises:

  • HttpContextWrapper - System.Web.dll
  • RemoteEndpointMessageProperty - System.ServiceModel.dll
  • OwinContext - Microsoft.Owin.dll (vous l'avez déjà si vous utilisez Owin paquet)

Un petit problème avec cette solution est que vous devez charger des bibliothèques pour toutes les 3 cas, quand vous allez réellement être en utilisant seulement l'un d'entre eux au cours de l'exécution. Comme suggéré ici, cela peut être surmonté en utilisant dynamic variables. Vous pouvez aussi écrire à l' GetClientIpAddress méthode comme une extension pour HttpRequestMethod.

public static class HttpRequestMessageExtensions
{
    private const string HttpContext = "MS_HttpContext";
    private const string RemoteEndpointMessage =
        "System.ServiceModel.Channels.RemoteEndpointMessageProperty";
    private const string OwinContext = "MS_OwinContext";

    public static string GetClientIpAddress(this HttpRequestMessage request)
    {
       // Web-hosting. Needs reference to System.Web.dll
       if (request.Properties.ContainsKey(HttpContext))
       {
           dynamic ctx = request.Properties[HttpContext];
           if (ctx != null)
           {
               return ctx.Request.UserHostAddress;
           }
       }

       // Self-hosting. Needs reference to System.ServiceModel.dll. 
       if (request.Properties.ContainsKey(RemoteEndpointMessage))
       {
            dynamic remoteEndpoint = request.Properties[RemoteEndpointMessage];
            if (remoteEndpoint != null)
            {
                return remoteEndpoint.Address;
            }
        }

       // Self-hosting using Owin. Needs reference to Microsoft.Owin.dll. 
       if (request.Properties.ContainsKey(OwinContext))
       {
           dynamic owinContext = request.Properties[OwinContext];
           if (owinContext != null)
           {
               return owinContext.Request.RemoteIpAddress;
           }
       }

        return null;
    }
}

Maintenant, vous pouvez l'utiliser comme ceci:

public class TestController : ApiController
{
    [HttpPost]
    [ActionName("TestRemoteIp")]
    public string TestRemoteIp()
    {
        return Request.GetClientIpAddress();
    }
}

33voto

zacharydl Points 1294

Si vraiment, vous voulez un bon mot et ne prévoyez pas de self-host Web API :

13voto

Ci-dessus les réponses requièrent une référence à System.Web pour pouvoir monter la propriété HttpContext ou HttpContextWrapper. Si vous ne voulez pas la référence, vous êtes en mesure d’obtenir l’adresse ip à l’aide d’une dynamique :

-2voto

Warren Points 2273

La solution apportée par carlosfigueira fonctionne, mais de type sécurisé one-liners sont mieux : ajouter un puis accéder à dans votre méthode d’action.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X