2010-03-28 7 views
7

Ich verwende ASP.NET (.asmx) Webdienste mit Silverlight. Da es keine Möglichkeit gibt, die Client-IP-Adresse in Silverlight zu finden, musste ich dies auf der Service-Seite protokollieren. Dies sind einige Methoden, die ich versucht habe:Client-IP-Adresse in 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(); 

Alle oben genannten Methoden auf meinem lokalen System gut funktionieren, aber wenn ich meinen Dienst auf einem Produktionsserver zu veröffentlichen, beginnt es gibt Fehler,

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

Antwort

2

Wenn Sie einen Blick auf den System.Web.Hosting.ISAPIWorkerRequestInProc.GetAdditionalServerVar Code mit Reflektor, ist das, was wir sehen:

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

Ich sehe zwei Gründe, warum dies eine Nullreferenceexception erhöhen könnte:

1) Es gibt ein Multithreading-Problem auf dem _additionalServerVars-Mitglied. Ich denke nicht, dass dies passieren könnte, weil A) ich sehe nicht, warum Ihr Server während des Tests stark belastet würde, und B) die ISAPIWorkerRequestInProc -Instanz ist wahrscheinlich an einen Thread gebunden.

2) Ihr Server ist nicht auf dem neuesten Stand und der Code in der Produktion ist nicht der gleiche wie der, den ich auf meinem Rechner sehe.

Also was ich tun würde ist, überprüfen Sie den Server, um sicherzustellen, dass es mit den .NET Framework-DLLs auf dem neuesten Stand ist.

5

Sie sollten versuchen, genau herauszufinden, woher die NullReferenceException stammt. Ändern Sie Ihren Code, um zu verstehen, dass bestimmte Dinge null zurückgeben können. Zum Beispiel in

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

HttpContext.Current könnte null retrun oder .Request könnte null zurück, oder .ServerVariables["REMOTE_ADDR"] könnte null zurück. Auch in

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

die GetHostAddresses(strHostName) könnte null zurück, oder die .GetValue(0) könnte null zurück.

Wenn eine Methode oder Eigenschaft null zurückgeben könnte, sollten Sie vor der Dereferenzierung nach null suchen. Zum Beispiel

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. Ich weiß nicht, warum Sie GetValue(0) verwenden würden. Verwenden Sie stattdessen hostAddresses[0].

+0

NULL Reference Ausnahme tritt auf, wenn ich versuche, Request.UserHostAddress oder HttpContext.Current.Request.ServerVariables [ "REMOTE_ADDR"] Ich kann nicht nur eine Möglichkeit herauszufinden, die Client-IP in meinem asmx Service zu erhalten. = ( –

+0

@Zain: Wie ich schon sagte, überprüfe auf Null, bevor du irgendeinen dieser Werte verwendest. In der Tat solltest du 'HttpContext.Current' testen, um zu sehen, ob es null ist, bevor du' HttpContext.Current.Request' probierst. –

Verwandte Themen