AsNet Web API 2.1 클라이언트 IP 주소 가져오기
안녕하세요. 웹 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;
}
}
다음 링크가 도움이 될 수 있습니다.다음 링크의 코드입니다.
참조: 클라이언트-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;
}
}
}
}
다른 방법은 다음과 같습니다.
참조: 클라이언트-s-ip-address에 액세스하는 방법
웹 호스팅 버전의 경우
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();
우리는 이것을 프로젝트에 사용합니다.
Source/Reference: ASP에서 클라이언트의 IP 주소를 검색하는 중입니다.NET 웹 API
만약 당신이 Asp와 자기 진행을 하고 있다면.OWIN 자체 호스트 NuGet 패키지를 사용하는 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;
}
적어도 IIS에서 호스팅하고 있다면, 이 4년 된 게시물에 회신하는 것은 저에게 너무 복잡해 보이기 때문입니다.
해결 방법은 다음과 같습니다.
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와 클라이언트 호스트 이름을 제공합니다.그 이후로 그들이 버그를 고친 것이 아닐까요?
에 던지는 것이 좋습니다.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;
}
내 솔루션은 사용자 1587439의 응답과 비슷하지만 HttpContext에 액세스하는 대신 컨트롤러의 인스턴스에서 직접 작동합니다.현재).
'Watch' 창에서 저는 이것을 보았습니다.컨텍스트 요청.WebRequest에는 'UserHostAddress' 속성이 포함되어 있지만, 이 속성은 'System' 내부에 있는 WebHostHttpRequestContext 유형에 의존하기 때문입니다.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.
언급URL : https://stackoverflow.com/questions/22532806/asp-net-web-api-2-1-get-client-ip-address
'programing' 카테고리의 다른 글
| 에서 밀리초 단위로 잘라내는 방법.NET 날짜 시간 (0) | 2023.05.07 |
|---|---|
| ngFor(Angular 9) 내부의 동적 템플릿 참조 변수 (0) | 2023.05.07 |
| ASP에서 Excel 파일을 생성하는 중입니다.그물 (0) | 2023.05.07 |
| Bash 스크립트에서 현재 디렉토리 변경 (0) | 2023.05.07 |
| C#에서 Final/Disposure 방법 사용 (0) | 2023.05.07 |