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

你好,我需要得到客户端 IP,请求一些方法在网络应用程序接口, 我试过使用 给你中的这个代码,但它总是返回服务器本地 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;
}
}
166683 次浏览

下面的链接可能会对你有所帮助。

参考资料: 通过 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;
}
}
}
}

下面是另一种方法。

参考资料: 如何访问客户端的 IP 地址

网站托管版本

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();

我们在项目中使用它。

资料来源/参考文献: 在 ASP.NET Web API 中检索客户端的 IP 地址

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

在“看”窗口,我看到这个。RequestContext.WebRequest 包含“ UserHostAddress”属性,但是因为它依赖于 WebHostHttpRequestContext 类型(这是“ System”的内部类型)。韦伯。我无法直接访问它,所以我使用反射来直接访问它:

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 和客户机主机名,而不是服务器。也许他们已经修好了窃听器?

string userRequest = System.Web.HttpContext.Current.Request.UserHostAddress;

这招对我管用。

这一个返回我相同的回报,我从 UserHostAddress得到。