Get the IP address of the client connecting to a C# .NET WebAPI application

我与影子孤独终老i 提交于 2019-12-19 09:16:25

问题


I tried:

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;
}

according to:

Retrieving the client's IP address in ASP.Net Web API

this is the combined approach which should be valid for self host and webapi host. Unfortunately I get null instead of the IP address.

I'm trying locally so I'd expect 127.0.0.1 or localhost as the IP address


回答1:


Here is an expanded version of what you have that works for me.

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;
    }

}

Assuming you are in a controller the above extension method allows for calls like:

HttpRequestMessage request = this.Request;

var ip = request.GetClientIpString();


来源:https://stackoverflow.com/questions/38095938/get-the-ip-address-of-the-client-connecting-to-a-c-sharp-net-webapi-application

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!