2010-03-28 14 views
7

Estoy usando servicios web ASP.NET (.asmx) con Silverlight. Como no hay forma de encontrar la dirección IP del cliente en Silverlight, tuve que registrar esto al final del servicio. Estos son algunos de los métodos que he intentado:Dirección IP del cliente en ASP.NET (.asmx) webservices

Request.ServerVariables("REMOTE_HOST") 
HttpContext.Current.Request.ServerVariables["REMOTE_ADDR"] 
HttpContext.Current.Request.ServerVariables["HTTP_X_FORWARDED_FOR"]; 
Request.UserHostAddress() 
Request.UserHostName() 
string strHostName = Dns.GetHostName(); 
string clientIPAddress = Dns.GetHostAddresses(strHostName).GetValue(0).ToString(); 

Todos los métodos anteriores funcionan bien en mi sistema local, pero cuando publico mi servicio en un servidor de producción, se inicia error que dio,

Error: Object reference not set to an instance of an object. StackTrace:

at System.Web.Hosting.ISAPIWorkerRequestInProc.GetAdditionalServerVar(Int32 index)

at System.Web.Hosting.ISAPIWorkerRequestInProc.GetServerVariable(String name)

at System.Web.Hosting.ISAPIWorkerRequest.GetRemoteAddress()

at System.Web.HttpRequest.get_UserHostAddress()

Respuesta

2

Si se echa un vistazo usando Reflector en el código System.Web.Hosting.ISAPIWorkerRequestInProc.GetAdditionalServerVar, eso es lo que vemos:

private string GetAdditionalServerVar(int index) 
{ 
    if (this._additionalServerVars == null) 
    { 
     this.GetAdditionalServerVariables(); 
    } 
    return this._additionalServerVars[index - 12]; 
} 

Veo dos razones por las que esto podría plantear una NullReferenceException:

1) hay un problema de multihilo en el miembro _additionalServerVars. No creo que esto pueda suceder porque A) No veo por qué habría una gran carga en su servidor durante la prueba, y B) la instancia de ISAPIWorkerRequestInProc probablemente esté vinculada a un hilo.

2) su servidor no está actualizado y el código en producción no es el mismo que el que estoy viendo en mi máquina.

Entonces, lo que haría es verificar el servidor asegurándose de que esté actualizado con .NET Framework dlls.

Excepción
5

Intente averiguar exactamente de dónde viene el NullReferenceException. Cambie su código para comprender que ciertas cosas pueden devolver nulo. Por ejemplo, en

HttpContext.Current.Request.ServerVariables["REMOTE_ADDR"] 

HttpContext.Current podría retrun nula o .Request podría devolver null, o .ServerVariables["REMOTE_ADDR"] podría devolver null. Además, en

string clientIPAddress = System.Net.Dns.GetHostAddresses(strHostName).GetValue(0).ToString(); 

la GetHostAddresses(strHostName) podría devolver null, o la .GetValue(0) podría devolver null.

Si un método o propiedad puede devolver nulo, entonces debe verificar null antes de desreferenciarlo. Por ejemplo,

IPAddress[] hostAddresses = System.Net.Dns.GetHostAddresses(strHostName); 
string clientIPAddress; 
if (hostAddresses != null) 
{ 
    object value = hostAddresses.GetValue(0); 
    if (value != null) 
    { 
     clientIPAddress = value.ToString(); 
    } 
} 

P.S. No sé por qué usarías GetValue(0). Use hostAddresses[0] en su lugar.

+0

NULL referencia se produce cuando intento Request.UserHostAddress o HttpContext.Current.Request.ServerVariables [ "REMOTE_ADDR"] simplemente no puedo encontrar cualquier manera de conseguir que el cliente IP en mi servicio asmx. = ( –

+0

@Zain: como dije, busca null antes de usar cualquiera de estos valores. De hecho, asegúrate de probar 'HttpContext.Current' para ver si es nulo antes de probar' HttpContext.Current.Request'. –

Cuestiones relacionadas