2010-03-28 12 views
7

Sto utilizzando i servizi Web ASP.NET (.asmx) con Silverlight. Poiché non è possibile trovare l'indirizzo IP del client in Silverlight, è stato necessario registrarlo sul servizio. Questi sono alcuni metodi che ho provato:Indirizzo IP del client nei servizi Web ASP.NET (.asmx)

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

Tutti i metodi di cui sopra funzionano bene sul mio sistema locale, ma quando pubblico il mio servizio su un server di produzione, inizia a dare errori,

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()

risposta

2

Se si dà un'occhiata utilizzando Reflector il codice System.Web.Hosting.ISAPIWorkerRequestInProc.GetAdditionalServerVar, questo è quello che vediamo:

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

Vedo due motivi per cui questo potrebbe sollevare un NullReferenceException:

1) c'è un problema di multithreading sul membro _additionalServerVars. Non penso che questo potrebbe accadere perché A) non vedo perché ci sarebbe un grande carico sul tuo server durante il test, e B) l'istanza ISAPIWorkerRequestInProc è probabilmente legata a un thread.

2) il tuo server non è aggiornato e il codice in produzione non è lo stesso di quello che vedo sulla mia macchina.

Quindi quello che vorrei fare è controllare il server assicurandosi che sia aggiornato con le DLL di .NET Framework.

5

Dovresti provare a scoprire esattamente da dove proviene il NullReferenceException. Cambia il tuo codice per capire che certe cose possono restituire null. Ad esempio, in

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

HttpContext.Current potrebbe retrun nullo, o .Request potrebbe restituire null, o .ServerVariables["REMOTE_ADDR"] potrebbe restituire null. Inoltre

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

il GetHostAddresses(strHostName) potrebbe restituire null, o .GetValue(0) potrebbe restituire null.

Se un metodo o una proprietà possono restituire null, è necessario verificare la presenza di null prima di dereferenziarlo. Ad esempio,

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. Non so perché useresti lo GetValue(0). Utilizzare invece hostAddresses[0].

+0

NULL Riferimento eccezione si verifica quando provo Request.UserHostAddress o HttpContext.Current.Request.ServerVariables [ "REMOTE_ADDR"] ho appena cant scoprire un modo per ottenere il client IP nel mio servizio ASMX. = ( –

+0

@Zain: come ho detto, controlla null prima di utilizzare uno di questi valori, accertati di testare 'HttpContext.Current' per vedere se è null prima di provare' HttpContext.Current.Request'. –