Получить IP-адрес клиента, подключающегося к приложению C # .NET WebAPI

Я старался:

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

public static string GetClientIpAddress(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;
}

в соответствии с:

Получение IP-адреса клиента в ASP.Net Web API

это комбинированный подход, который должен быть действительным для собственного хоста и хоста webapi. К сожалению я получаюnull вместо IP-адреса.

Я пытаюсь локально, поэтому я ожидал127.0.0.1 или жеlocalhost как IP-адрес

Ответы на вопрос(1)

Решение Вопроса

что у вас есть, что работает для меня.

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 GetClientIpString(this HttpRequestMessage request) {
        //Web-hosting
        if (request.Properties.ContainsKey(HttpContext)) {
            dynamic ctx = request.Properties[HttpContext];
            if (ctx != null) {
                return ctx.Request.UserHostAddress;
            }
        }
        //Self-hosting
        if (request.Properties.ContainsKey(RemoteEndpointMessage)) {
            dynamic remoteEndpoint = request.Properties[RemoteEndpointMessage];
            if (remoteEndpoint != null) {
                return remoteEndpoint.Address;
            }
        }
        //Owin-hosting
        if (request.Properties.ContainsKey(OwinContext)) {
            dynamic ctx = request.Properties[OwinContext];
            if (ctx != null) {
                return ctx.Request.RemoteIpAddress;
            }
        }
        if (System.Web.HttpContext.Current != null) {
            return System.Web.HttpContext.Current.Request.UserHostAddress;
        }
        // Always return all zeroes for any failure
        return "0.0.0.0";
    }

    public static IPAddress GetClientIpAddress(this HttpRequestMessage request) {
        var ipString = request.GetClientIpString();
        IPAddress ipAddress = new IPAddress(0);
        if (IPAddress.TryParse(ipString, out ipAddress)) {
            return ipAddress;
        }

        return ipAddress;
    }

}

Предполагая, что вы находитесь в контроллере, вышеупомянутый метод расширения допускает такие вызовы:

HttpRequestMessage request = this.Request;

var ip = request.GetClientIpString();
 Nkosi29 июн. 2016 г., 12:16
это метод расширения. Когда в статическом классе это позволяет для вызовов, таких какrequest.GetClientIpString();
 Gianluca Ghettini29 июн. 2016 г., 12:14
что это за "это"? Я имею в виду, после параметра
 Nkosi29 июн. 2016 г., 12:20
Это правильно :: 1 - это ipv6 для localhost, который совпадает с ipv4-версией 127.0.0.1
 Gianluca Ghettini29 июн. 2016 г., 12:17
Я получаю :: 1 из моего локального webapi .. как вы думаете, это правильно? Это псевдоним для 127.0.0.1?
 Gianluca Ghettini29 июн. 2016 г., 12:20
отлично. ответ принят. Спасибо

Ваш ответ на вопрос