2012-06-15 29 views

Respuesta

5

El problema con HttpContext.Request.Current.UserHostAddress es que HttpContext.Request.Current es nulo si es autohospedado.

La forma en que lo consigue en la versión actual de SignalR (la rama 'dev' a partir del 14/12/2012) es así:

protected string GetIpAddress() 
{ 
    var env = Get<IDictionary<string, object>>(Context.Request.Items, "owin.environment"); 
    if (env == null) 
    { 
     return null; 
    } 
    var ipAddress = Get<string>(env, "server.RemoteIpAddress"); 
    return ipAddress; 
} 

private static T Get<T>(IDictionary<string, object> env, string key) 
{ 
    object value; 
    return env.TryGetValue(key, out value) ? (T)value : default(T); 
} 

Usted solía ser capaz de conseguirlo a través de Context.ServerVariables :

protected string GetIpAddress() 
{ 
    var ipAddress = Context.ServerVariables["REMOTE_ADDR"]; 
    return ipAddress; 
} 

Eso fue mucho más simple, pero lo eliminaron por razones que no entiendo del todo.

+0

Supongamos que nadie está utilizando la rama dev (a menos que se indique explícitamente), ya que representa un punto en el tiempo sha que puede cambiar en cualquier momento entre ahora y una versión. – davidfowl

+1

Marcando esto como la respuesta ya que Owin ahora es fundamentalmente parte de ASP.NET SignalR. –

0

Según source code no, no hay tal propiedad en HubCallerContext.

26

Con SignalR 2.0, Context.Request ya no tiene el Items (al menos no lo que vi). Me di cuenta de cómo funciona ahora. (Se puede reducir el/la parte más si a un operador ternario, si te gusta eso.)

protected string GetIpAddress() 
    { 
     string ipAddress; 
     object tempObject; 

     Context.Request.Environment.TryGetValue("server.RemoteIpAddress", out tempObject); 

     if (tempObject != null) 
     { 
      ipAddress = (string)tempObject; 
     } 
     else 
     { 
      ipAddress = ""; 
     } 

     return ipAddress; 
    } 
+6

Una respuesta completa. En su forma más simple podría usar 'Context.Request.Environment [" server.RemoteIpAddress "]' –

1

Otra forma es

var serverVars = Context.Request.GetHttpContext().Request.ServerVariables; 
var Ip = serverVars["REMOTE_ADDR"]; 
Cuestiones relacionadas