programing

AsNet Web API 2.1 클라이언트 IP 주소 가져오기

iphone6s 2023. 5. 7. 11:16
반응형

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

반응형