Asp-Net Web API 2.1获取客户端IP地址
本文关键字:客户端 IP 地址 获取 Web API Asp-Net | 更新日期: 2023-09-27 17:51:13
你好,我需要获得请求web api中某个方法的客户端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;
}
}
以下链接可能会对您有所帮助。以下是来自以下链接的代码。
参考:通过asp-net-web-api获取客户端ip
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;
使用Web API 2.2:Request.GetOwinContext().Request.RemoteIpAddress
尝试使用获取Ip
ip = HttpContext.Current != null ? 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;
}
}
所以就这样使用吧:
var ipAddress = request.GetClientIpAddress();
我们在项目中使用这个。
来源/参考:在ASP中检索客户端的IP地址。NET Web API
回复这篇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和客户端主机名,而不是服务器。也许他们从那时起就修复了这个错误?
如果您使用Asp自托管。Net 2.1使用OWIN Self主机NuGet包可以使用以下代码:
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;
}
最好将其转换为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;
}
我的解决方案类似于user1587439的答案,但直接在控制器的实例上工作(而不是访问HttpContext.Current(
在"观察"窗口,我看到了这个。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;
我并不是说这是最好的解决方案。在将来升级框架的情况下(由于名称更改(,使用反射可能会导致问题,但对于我的需要,它是完美的
string userRequest = System.Web.HttpContext.Current.Request.UserHostAddress;
这对我有效。
System.Web.HttpContext.Current.Request.UserHostName;
这一次给我的回报与我从UserHostAddress
得到的回报相同。