私は 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;
}
コントローラー ページからこの関数を呼び出すにはどうすればよいでしょうか?
ベストアンサー1
簡単な答えは、HttpRequest.UserHostAddress プロパティ。
例:コントローラー内から:
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;
..
}
}
}
しかし、リクエストが1人または複数人に渡された場合、プロキシサーバー次に返されるIPアドレスはHttpRequest.UserHostAddress プロパティリクエストを中継した最後のプロキシ サーバーの IP アドレスになります。
プロキシサーバーは、クライアントのIPアドレスをX-転送先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;
}