Arb*_*æde 107 c# asp.net asp.net-web-api
您好我需要获取请求web api中的某些方法的客户端IP,我试图从这里使用此代码但它总是返回服务器本地IP,如何以正确的方式获取?
HttpContext.Current.Request.UserHostAddress;
Run Code Online (Sandbox Code Playgroud)
来自其他问题:
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;
}
}
Run Code Online (Sandbox Code Playgroud)
Jal*_*ama 117
以下链接可能对您有帮助.以下是来自以下链接的代码.
参考:getting-the-client-ip-via-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;
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
另一种方法是在下面.
reference:how-to-access-the-client-s-ip-address
对于Web托管版本
string clientAddress = HttpContext.Current.Request.UserHostAddress;
Run Code Online (Sandbox Code Playgroud)
为自我托管
object property;
Request.Properties.TryGetValue(typeof(RemoteEndpointMessageProperty).FullName, out property);
RemoteEndpointMessageProperty remoteProperty = property as RemoteEndpointMessageProperty;
Run Code Online (Sandbox Code Playgroud)
Ben*_*lde 69
使用Web API 2.2: Request.GetOwinContext().Request.RemoteIpAddress
小智 16
尝试使用Ip
ip = HttpContext.Current != null ? HttpContext.Current.Request.UserHostAddress : "";
Run Code Online (Sandbox Code Playgroud)
Vas*_*pov 10
我认为这是最清晰的解决方案,使用扩展方法:
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;
}
}
Run Code Online (Sandbox Code Playgroud)
所以只需像这样使用它:
var ipAddress = request.GetClientIpAddress();
Run Code Online (Sandbox Code Playgroud)
我们在我们的项目中使用它。
来源/参考:在 ASP.NET Web API 中检索客户端的 IP 地址
如果您使用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;
}
Run Code Online (Sandbox Code Playgroud)
回复这个已有4年历史的帖子,因为对我来说,这似乎过于复杂,至少如果您在IIS上托管,并且此帖子在DuckDuckGo(可能还有NSAoogle)上针对“ Web api控制器获取IP地址”的建议很高。
这是我解决的方法:
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);
...
Run Code Online (Sandbox Code Playgroud)
与OP不同,这为我提供了客户端IP和客户端主机名,而不是服务器。也许从那以后他们已经修复了该错误?
小智 5
最好将它投射到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;
}
Run Code Online (Sandbox Code Playgroud)