Asp Net Web API 2.1 mendapatkan alamat IP klien


112

Halo, saya perlu mendapatkan IP klien yang meminta beberapa metode dalam api web, saya telah mencoba menggunakan kode ini dari sini tetapi selalu mengembalikan IP lokal server, bagaimana cara mendapatkannya dengan cara yang benar?

HttpContext.Current.Request.UserHostAddress;

dari pertanyaan lain:

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

Metode ekstensi ini bekerja dengan baik untuk saya. (Saya tidak menggunakan OWIN atau sesuatu yang tidak biasa.)
Nate Barbettini

bagus untuk mengakui sumber. Diedit
Stefano Mtangoo

Jawaban:


124

Tautan berikut mungkin membantu Anda. Berikut kode dari tautan berikut.

referensi: mendapatkan-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;
                }
           }
     }
}

Cara lain untuk melakukannya ada di bawah.

referensi: cara-mengakses-klien-s-ip-address

Untuk versi yang dihosting web

string clientAddress = HttpContext.Current.Request.UserHostAddress;

Untuk dihosting sendiri

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


16

Cobalah untuk mendapatkan Ip menggunakan

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

1
@DenisBabarykin Saya pikir seharusnya, .. mengembalikan alamat IP dalam variabel server REMOTE_ADDR
user1587439

9

Jika Anda menghosting sendiri dengan Asp.Net 2.1 menggunakan paket NuGet OWIN Self-host Anda dapat menggunakan kode berikut:

 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

Membalas posting lama 4 tahun ini, karena ini tampaknya terlalu rumit bagi saya, setidaknya jika Anda menghosting di IIS dan posting ini sangat tinggi di DuckDuckGo (dan mungkin NSAoogle) untuk "pengontrol api web dapatkan alamat IP".

Inilah cara saya menyelesaikannya:

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

Tidak seperti OP, ini memberi saya IP klien dan nama host klien, bukan server. Mungkin mereka telah memperbaiki bug sejak itu?


Ingin sekali melihat jawaban untuk menggunakan API web DotNetCore. Saya tidak percaya ini sulit untuk melakukan sesuatu yang sangat sederhana.
MC9000

5

Lebih baik melemparkannya ke HttpContextBase, dengan cara ini Anda dapat mengejek dan mengujinya dengan lebih mudah

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
Saya mencari-cari di Google dan tampaknya orang lain setuju dengan ini (gunakan HttpContextBase alih-alih HttpContextWrapper karena HttpContextBase lebih mudah diejek.)
Dave Clausen

4

Saya pikir ini adalah solusi paling jelas, menggunakan metode ekstensi:

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

Jadi gunakan saja seperti:

var ipAddress = request.GetClientIpAddress();

Kami menggunakan ini dalam proyek kami.

Sumber / Referensi: Mengambil alamat IP klien di ASP.NET Web API


2

Solusi saya mirip dengan jawaban user1587439, tetapi bekerja langsung pada contoh pengontrol (alih-alih mengakses HttpContext.Current).

Di jendela 'Tonton', saya melihat this.RequestContext.WebRequest berisi properti 'UserHostAddress', tetapi karena ini bergantung pada jenis WebHostHttpRequestContext (yang merupakan internal untuk perakitan 'System.Web.Http') - saya tidak dapat mengaksesnya secara langsung, jadi saya menggunakan refleksi untuk mengaksesnya secara langsung:

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

Saya tidak mengatakan itu solusi terbaik. menggunakan refleksi dapat menyebabkan masalah di masa depan dalam kasus peningkatan kerangka kerja (karena perubahan nama), tetapi untuk kebutuhan saya itu sempurna


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

Ini berhasil pada saya.

System.Web.HttpContext.Current.Request.UserHostName;yang satu ini mengembalikan saya pengembalian yang sama yang saya dapatkan dari UserHostAddress.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.