1. ホーム
  2. c#

[解決済み】ASP.NET MVCでクライアントのIPアドレスを取得するにはどうすればいいですか?

2022-03-26 09:21:06

質問内容

私はASP.NET MVCスタックの全くの初心者ですが、単純なPageオブジェクトとRequest ServerVariablesオブジェクトはどうなったのでしょうか?

基本的には、クライアントPCのIPアドレスを抜き出したいのですが、現在のMVCの構造がどのように変化したのか理解できません。

私が理解できる範囲では ほとんどの変数オブジェクトは、HttpRequestの亜種に置き換わっています。 .

どなたか、リソースを教えてください。ASP.NET MVCの世界では学ぶべきことが本当に山ほどあるんです。)

例えば、私はこのような現在の関数を持つ静的なクラスを持っています。ASP.NET MVCを使用して同じ結果を得るにはどうすればよいでしょうか?

public static int getCountry(Page page)
{
    return getCountryFromIP(getIPAddress(page));
}

public static string getIPAddress(Page page)
{
    string szRemoteAddr = page.Request.ServerVariables["REMOTE_ADDR"];
    string szXForwardedFor = page.Request.ServerVariables["X_FORWARDED_FOR"];
    string szIP = "";

    if (szXForwardedFor == null)
    {
        szIP = szRemoteAddr;
    }
    else
    {
        szIP = szXForwardedFor;

        if (szIP.IndexOf(",") > 0)
        {
            string [] arIPs = szIP.Split(',');

            foreach (string item in arIPs)
            {
                if (!isPrivateIP(item))
                {
                    return item;
                }
            }
        }
    }
    return szIP;
}

また、コントローラページからこの関数を呼び出すにはどうすればよいのでしょうか?

どのように解決するのですか?

簡単な答えは HttpRequest.UserHostAddress プロパティ .

Controllerの中から。

using System;
using System.Web.Mvc;

namespace Mvc.Controllers
{
    public class HomeController : ClientController
    {
        public ActionResult Index()
        {
            string ip = Request.UserHostAddress;

            ...
        }
    }
}

ヘルパークラス内から

using System.Web;

namespace Mvc.Helpers
{
    public static class HelperClass
    {
        public static string GetIPHelper()
        {
            string ip = HttpContext.Current.Request.UserHostAddress;
            ..
        }
    }
}

BUT, リクエストが1つ以上引き継がれている場合。 プロキシサーバー によって返されるIPアドレスは HttpRequest.UserHostAddressプロパティ は、リクエストを中継した最後のプロキシサーバーのIPアドレスになります。

プロキシサーバー メイ を使用します。 デファクト の中にクライアントの IP アドレスを入れるのが標準です。 X-Forwarded-Forの場合 HTTPヘッダーです。リクエストがX-Forwarded-Forヘッダを持つという保証はありませんが、X-Forwarded-Forが スプーフィング .


オリジナル回答

Request.UserHostAddress

上記のコードでは、コレクションを検索することなく、クライアントのIPアドレスを提供しています。Request プロパティはコントローラ (またはビュー) 内で使用できます。したがって、関数に Page クラスを渡す代わりに、Request オブジェクトを渡して同じ結果を得ることができます。

public static string getIPAddress(HttpRequestBase request)
{
    string szRemoteAddr = request.UserHostAddress;
    string szXForwardedFor = request.ServerVariables["X_FORWARDED_FOR"];
    string szIP = "";

    if (szXForwardedFor == null)
    {
        szIP = szRemoteAddr;
    }
    else
    {
        szIP = szXForwardedFor;
        if (szIP.IndexOf(",") > 0)
        {
            string [] arIPs = szIP.Split(',');

            foreach (string item in arIPs)
            {
                if (!isPrivateIP(item))
                {
                    return item;
                }
            }
        }
    }
    return szIP;
}