[c#] ASP Net 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;
        }
    }



답변

다음 링크가 도움이 될 수 있습니다. 다음 링크의 코드는 다음과 같습니다.

참조 : 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 : "";


답변

OWIN 자체 호스트 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;
    }


답변

이 4 년 된 게시물에 답장하는 것은 이것이 나에게 지나치게 복잡해 보이므로 적어도 IIS에서 호스팅하고이 게시물이 “웹 API 컨트롤러가 IP 주소를 얻음”에 대해 DuckDuckGo (그리고 아마도 NSAoogle)에서 매우 높은 경우에 해당합니다.

해결 방법은 다음과 같습니다.

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;
}


답변

확장 방법을 사용하는 가장 명확한 솔루션이라고 생각합니다.

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 주소 검색