Asp Net Web API 2.1はクライアントIPアドレスを取得します


112

こんにちは、Web 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または異常なものを使用していません。)
Nate Barbettini 14

ソースを確認するのに最適です。編集
Stefano Mtangoo

回答:


124

次のリンクはあなたを助けるかもしれません。以下のリンクからのコードです。

リファレンス:getting-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;
                }
           }
     }
}

これを行う別の方法は次のとおりです。

リファレンス:how-to-access-the-client-s-ip-address

Webホストバージョンの場合

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でホスティングしていて、この投稿がDuckDuckGo(そしておそらくNSAoogle)で「web apiコントローラーがIPアドレスを取得する」で非常に高い場合、これは私には複雑すぎるようです。

これが私がそれを解決した方法です:

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 Web APIを使用するための答えを見てみたいです。こんなに初歩的なことをするのがこんなに難しいとは信じられません。
MC9000 2019

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.