Я создал настраиваемый фильтр действий веб-API для регистрации входящих вызовов. Я пытаюсь получить IP-адрес вызывающего абонента, и все, что я нашел, говорит, чтобы использовать Request.UserHostAddress
. Проблема в том, что независимо от того, откуда идет вызов, IP-адрес тот же.Почему я всегда получаю один и тот же IP-адрес при получении Request.UserHostAddress в пользовательском фильтре действий WebAPI?
Вот код для моего действия фильтра:
public class LogActionFilter : ActionFilterAttribute
{
public override void OnActionExecuting(HttpActionContext actionContext)
{
var name = actionContext.ActionDescriptor.ActionName;
// Get the sender address
var caller = ((HttpContextWrapper)actionContext.Request.Properties["MS_HttpContext"]).Request.UserHostAddress;
// Log the call
SystemBL.InsertSiteLog("WebAPI:" + name, "From:" + caller);
}
}
Я также попытался с:
var caller = ((HttpContextWrapper)actionContext.Request.Properties["MS_HttpContext"]).Request.ServerVariables["REMOTE_ADDR"].ToString();
, но результат был тот же. Есть идеи?
Лучше использовать параметр HttpActionContext, как здесь, и получить IP-адрес, или лучшее решение - использовать статический метод, который использует HttpContext, как здесь: [link] (https://stackoverflow.com/questions/1907195/how- to-get-ip-address) Я не знаю, какой подход выбрать. – krypru
Прошло некоторое время с тех пор, как я это сделал, но я думаю, что это зависит от того, где вы его используете. В моем случае я делал это в атрибуте фильтра, который не имеет доступа к текущему контексту из HttpContext. Если вы делаете это в регулярном действии MVC, я бы сказал, что использовать HttpContext, как кажется немного чище. Просто не забудьте провести парсинг адресов и использовать последний ip в списке. – Jason