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


112

안녕하세요, 웹 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;
        }
    }

이 확장 방법은 저에게 잘 작동합니다. (나는 OWIN 비정상적인 아무것도 사용하지 않는.)
네이트 Barbettini

출처를 인정하는 것이 좋습니다. 편집
스테파노 Mtangoo

답변:


124

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

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


16

사용하여 IP를 얻으십시오

ip = HttpContext.Current != null ? HttpContext.Current.Request.UserHostAddress : "";

1
@DenisBabarykin 내 생각에는 .. 그것은 서버 변수 REMOTE_ADDR에 IP 주소를 반환합니다
user1587439

9

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

7

이 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와 클라이언트 호스트 이름을 제공합니다. 아마도 그들은 그 이후로 버그를 수정했을까요?


DotNetCore 웹 API 사용에 대한 답변을보고 싶습니다. 그렇게 초보적인 일을하는 것이 이렇게 어렵다는 것을 믿을 수 없습니다.
MC9000

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

1
나는 주위를 봤고 다른 사람들이 이것에 동의하는 것 같다 (HttpContextBase가 모의하기 쉽기 때문에 HttpContextWrapper 대신 HttpContextBase로 캐스팅)
Dave Clausen

4

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

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


2

내 솔루션은 user1587439의 답변과 유사하지만 컨트롤러의 인스턴스에서 직접 작동합니다 (HttpContext.Current에 액세스하는 대신).

'감시'창에서 this.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;

이것이 최선의 해결책이라고 말하는 것이 아닙니다. 리플렉션을 사용하면 프레임 워크 업그레이드의 경우 (이름 변경으로 인해) 향후 문제가 발생할 수 있지만 내 필요에 따라 완벽합니다.


0
string userRequest = System.Web.HttpContext.Current.Request.UserHostAddress;

이것은 나에게 효과적입니다.

System.Web.HttpContext.Current.Request.UserHostName;이것은 나에게 UserHostAddress.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.