Asp Net Web API 2.1 lấy địa chỉ IP của máy khách


112

Xin chào, tôi cần lấy IP máy khách yêu cầu một số phương thức trong api web, tôi đã cố gắng sử dụng mã này từ đây nhưng nó luôn trả về IP cục bộ của máy chủ, làm thế nào để lấy đúng cách?

HttpContext.Current.Request.UserHostAddress;

từ các câu hỏi khác:

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

Phương pháp mở rộng này hoạt động tốt đối với tôi. (Tôi không sử dụng OWIN hoặc bất cứ điều gì bất thường.)
Nate Barbettini

tuyệt vời để thừa nhận nguồn. Đã chỉnh sửa
Stefano Mtangoo

Câu trả lời:


124

Liên kết sau có thể giúp bạn. Đây là mã từ liên kết sau.

tham khảo: get-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;
                }
           }
     }
}

Một cách khác để làm điều này là bên dưới.

tham khảo: how-to-access-the-client-s-ip-address

Đối với phiên bản được lưu trữ trên web

string clientAddress = HttpContext.Current.Request.UserHostAddress;

Đối với tự lưu trữ

object property;
        Request.Properties.TryGetValue(typeof(RemoteEndpointMessageProperty).FullName, out property);
        RemoteEndpointMessageProperty remoteProperty = property as RemoteEndpointMessageProperty;


16

Cố gắng lấy Ip bằng cách sử dụng

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

1
@DenisBabarykin Tôi nghĩ điều đó nên xảy ra, .. nó trả về địa chỉ IP trong biến máy chủ REMOTE_ADDR
user1587439

9

Nếu bạn đang tự lưu trữ với Asp.Net 2.1 sử dụng gói NuGet tự lưu trữ OWIN, bạn có thể sử dụng mã sau:

 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

Trả lời bài đăng 4 năm tuổi này, vì điều này có vẻ quá phức tạp với tôi, ít nhất là nếu bạn đang lưu trữ trên IIS và bài đăng này rất cao trên DuckDuckGo (và có thể là NSAoogle) cho "bộ điều khiển api web lấy địa chỉ IP".

Đây là cách tôi đã giải quyết nó:

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);
        ...

Không giống như OP, điều này cung cấp cho tôi IP máy khách và tên máy khách chứ không phải máy chủ. Có lẽ họ đã sửa lỗi kể từ đó?


Rất thích xem câu trả lời cho việc sử dụng API web DotNetCore. Tôi không thể tin rằng nó là khó khăn để làm một cái gì đó thô sơ như vậy.
MC9000

5

Tốt hơn là nên truyền nó đến HttpContextBase, bằng cách này, bạn có thể mô phỏng và kiểm tra nó dễ dàng hơn

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
Tôi googled xung quanh và những người khác dường như tán với điều này (diễn viên để HttpContextBase thay vì HttpContextWrapper vì HttpContextBase là dễ dàng hơn để chế nhạo.)
Dave Clausen

4

Tôi nghĩ đây là giải pháp rõ ràng nhất, sử dụng phương pháp mở rộng:

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

Vì vậy, chỉ cần sử dụng nó như:

var ipAddress = request.GetClientIpAddress();

Chúng tôi sử dụng điều này trong các dự án của chúng tôi.

Nguồn / Tham khảo: Truy xuất địa chỉ IP của khách hàng trong ASP.NET Web API


2

Giải pháp của tôi tương tự như câu trả lời của user1587439, nhưng hoạt động trực tiếp trên phiên bản của bộ điều khiển (thay vì truy cập HttpContext.Current).

Trong cửa sổ 'Watch', tôi thấy rằng this.RequestContext.WebRequest có chứa thuộc tính 'UserHostAddress', nhưng vì nó dựa vào loại WebHostHttpRequestContext (nằm bên trong hội đồng 'System.Web.Http') - Tôi đã không có thể truy cập trực tiếp vào nó, vì vậy tôi đã sử dụng phản chiếu để truy cập trực tiếp vào nó:

string hostAddress = ((System.Web.HttpRequestWrapper)this.RequestContext.GetType().Assembly.GetType("System.Web.Http.WebHost.WebHostHttpRequestContext").GetProperty("WebRequest").GetMethod.Invoke(this.RequestContext, null)).UserHostAddress;

Tôi không nói đó là giải pháp tốt nhất. sử dụng phản chiếu có thể gây ra sự cố trong tương lai trong trường hợp nâng cấp khung (do thay đổi tên), nhưng đối với nhu cầu của tôi, nó hoàn hảo


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

Điều này làm việc với tôi.

System.Web.HttpContext.Current.Request.UserHostName;cái này trả lại cho tôi cùng một khoản mà tôi nhận được từ UserHostAddress.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.