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;
        }
    }
Arbejdsglæde
sumber
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
Kemungkinan duplikat Dapatkan alamat IP dari host jarak jauh
Michael Freidgeim

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;
Jalpesh Vadgama
sumber
71

Dengan API Web 2.2: Request.GetOwinContext().Request.RemoteIpAddress

Ben Wilde
sumber
28
Perhatikan bahwa ini hanya berfungsi jika Anda menggunakan Owin - msdn.microsoft.com/en-us/library/…
Chandramouleswaran Ravichandra
16

Cobalah untuk mendapatkan Ip menggunakan

ip = HttpContext.Current != null ? HttpContext.Current.Request.UserHostAddress : "";
pengguna1587439
sumber
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;
    }
CoryC
sumber
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?

Scott R. Frost
sumber
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;
}
Maxime Nanouche
sumber
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

Vasil Popov
sumber
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

Nissim
sumber
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.

Robert Tan
sumber