2014-04-01 2 views
5

Я создал настраиваемый фильтр действий веб-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(); 

, но результат был тот же. Есть идеи?

ответ

7

Нашли ответ здесь: HttpContext.Current.Request.UserHostAddress is null.

В принципе, мне нужно было разобраться с пересылкой. Конечный код:

public override void OnActionExecuting(HttpActionContext actionContext) 
    { 
     var name = actionContext.ActionDescriptor.ActionName; 

     // Get the sender address 
     var myRequest = ((HttpContextWrapper)actionContext.Request.Properties["MS_HttpContext"]).Request; 
     var ip = myRequest.ServerVariables["HTTP_X_FORWARDED_FOR"]; 
     if (!string.IsNullOrEmpty(ip)) 
     { 
      string[] ipRange = ip.Split(','); 
      int le = ipRange.Length - 1; 
      string trueIP = ipRange[le]; 
     } 
     else 
     { 
      ip = myRequest.ServerVariables["REMOTE_ADDR"]; 
     } 

     // Log the call 
     SystemBL.InsertSiteLog("WebAPI:" + name, "From:" + ip); 
    } 

Спасибо всем. Я буду отмечать это как ответ через 2 дня, когда это позволяет мне.

+0

Лучше использовать параметр HttpActionContext, как здесь, и получить IP-адрес, или лучшее решение - использовать статический метод, который использует HttpContext, как здесь: [link] (https://stackoverflow.com/questions/1907195/how- to-get-ip-address) Я не знаю, какой подход выбрать. – krypru

+1

Прошло некоторое время с тех пор, как я это сделал, но я думаю, что это зависит от того, где вы его используете. В моем случае я делал это в атрибуте фильтра, который не имеет доступа к текущему контексту из HttpContext. Если вы делаете это в регулярном действии MVC, я бы сказал, что использовать HttpContext, как кажется немного чище. Просто не забудьте провести парсинг адресов и использовать последний ip в списке. – Jason