2014-04-01 13 views
5

Ho creato un filtro di azione personalizzato API Web per registrare le chiamate in arrivo. Sto cercando di ottenere l'indirizzo IP del chiamante e tutto quello che ho trovato dice di usare Request.UserHostAddress. Il problema è che indipendentemente da dove arriva la chiamata, l'IP è lo stesso.Perché ottengo sempre lo stesso IP quando ottengo Request.UserHostAddress nel filtro di azione personalizzato WebAPI?

Ecco il codice per il mio filtro azione:

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); 
    } 
} 

Ho anche provato con:

var caller = ((HttpContextWrapper)actionContext.Request.Properties["MS_HttpContext"]).Request.ServerVariables["REMOTE_ADDR"].ToString(); 

ma il risultato era lo stesso. Qualche idea?

risposta

7

Trovato la risposta qui: HttpContext.Current.Request.UserHostAddress is null.

Fondamentalmente, avevo bisogno di risolvere l'inoltro. Il codice finale è:

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); 
    } 

Grazie a tutti. Lo segnerò come risposta in 2 giorni quando me lo consente.

+0

È meglio usare il parametro HttpActionContext come qui e ricevere l'IP o la soluzione migliore è usare il metodo statico che usa HttpContext come qui: [link] (https://stackoverflow.com/questions/1907195/how- to-get-ip-address) Non sono sicuro di quale approccio scegliere. – krypru

+1

È passato un po 'di tempo da quando l'ho fatto, ma penso che dipenda da dove lo stai usando. Nel mio caso lo stavo facendo in un attributo filtro che non ha accesso al contesto corrente da HttpContext. Se lo stai facendo in una normale azione MVC, direi che uso HttpContext come sembra un po 'più pulito. Basta non dimenticare di fare l'analisi dell'indirizzo e utilizzare l'ultimo ip nell'elenco. – Jason

Problemi correlati