C# Asp Net Web API 2.1获取客户端IP地址

C# Asp Net Web API 2.1获取客户端IP地址,c#,asp.net,asp.net-web-api,C#,Asp.net,Asp.net Web Api,你好,我需要获取客户端IP,请求web api中的某些方法, 我曾尝试从中使用此代码,但它始终返回服务器本地IP, 如何以正确的方式进入 HttpContext.Current.Request.UserHostAddress; 其他问题: public static class HttpRequestMessageExtensions { private const string HttpContext = "MS_HttpContext"; priva

你好,我需要获取客户端IP,请求web 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;
        }
    }

下面的链接可能会对您有所帮助。下面是来自以下链接的代码

参考:

另一种方法如下

参考:

对于web托管版本

string clientAddress = HttpContext.Current.Request.UserHostAddress;
自我主持

object property;
        Request.Properties.TryGetValue(typeof(RemoteEndpointMessageProperty).FullName, out property);
        RemoteEndpointMessageProperty remoteProperty = property as RemoteEndpointMessageProperty;

尝试使用

ip = HttpContext.Current != null ? HttpContext.Current.Request.UserHostAddress : "";

如果您使用OWIN self-host NuGet软件包使用Asp.Net 2.1自托管,则可以使用以下代码:

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

使用Web API 2.2:
Request.GetOwinContext().Request.RemoteIpAddress

最好将其强制转换为
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;
}

我认为这是最清晰的解决方案,使用扩展方法:

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();
我们在项目中使用它


来源/参考:

我的解决方案类似于user1587439的答案,但直接在控制器实例上工作(而不是访问HttpContext.Current)

在“Watch”窗口中,我看到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


我不是说这是最好的解决方案。在将来的框架升级中使用反射可能会导致问题(由于名称的更改),但出于我的需要,回复这篇4年的帖子是完美的,因为这对我来说似乎过于复杂了,至少如果你是在IIS上托管的话

我是这样解决的:

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和客户端主机名,而不是服务器。也许从那以后他们已经修复了这个bug

string userRequest = System.Web.HttpContext.Current.Request.UserHostAddress;
这对我有用


System.Web.HttpContext.Current.Request.UserHostName
这个方法返回的返回值与我从
UserHostAddress

中得到的返回值相同。这个扩展方法对我很有效。(我没有使用OWIN或任何不寻常的东西。)感谢消息来源。Edited可能重复注意,这只在您使用Owin-@DenisBabarykin时有效,我认为它应该,…它返回服务器变量REMOTE_ADDRI google中的IP地址,其他人似乎同意这一点(转换为HttpContextBase而不是HttpContextWrapper,因为HttpContextBase更容易模拟)
string userRequest = System.Web.HttpContext.Current.Request.UserHostAddress;