Простой ответ - использовать свойство 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;
..
}
}
}
НО, если запрос был передан одним или несколькими прокси-серверами , тогда IP-адрес, возвращаемый свойством HttpRequest.UserHostAddress , будет IP-адрес последнего прокси-сервера, который ретранслировал запрос.
Прокси-серверы МОГУТ использовать стандарт de facto для размещения IP-адреса клиента в заголовке HTTP X-Forwarded-For . Кроме того, нет никакой гарантии, что запрос имеет заголовок X-Forwarded-For, также нет гарантии, что X-Forwarded-For не был SPOOFED .
Оригинальный ответ
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;
}