2010-03-28 14 views
7

Używam serwisów ASP.NET (.asmx) z Silverlight. Ponieważ nie ma sposobu na znalezienie adresu IP klienta w Silverlight, musiałem zalogować to na końcu usługi. Są pewne sposoby próbowałem:Adres IP klienta w 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(); 

Wszystkie powyższe metody działają dobrze na moim komputerze lokalnym, ale kiedy opublikować moją usługę na serwerze produkcyjnym, zaczyna błędy podając,

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

Odpowiedz

2

Jeśli spojrzeć za pomocą reflektora w kodzie System.Web.Hosting.ISAPIWorkerRequestInProc.GetAdditionalServerVar, że to, co widzimy:

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

widzę dwa powody, dla których może to podnieść NullReferenceException:

1) istnieje problem z wielowątkowością na członku _additionalServerVars. Nie sądzę, aby tak się stało, ponieważ A) Nie widzę powodu, dla którego podczas testu wystąpiłoby duże obciążenie serwera, a B) instancja ISAPIWorkerRequestInProc jest prawdopodobnie powiązana z wątkiem.

2) Twój serwer nie jest aktualny, a kod produkcyjny jest inny niż ten, który widzę na moim komputerze.

To, co chciałbym zrobić, to sprawdzić serwer, upewniając się, że jest on aktualny w bibliotekach .NET Framework.

Wyjątek
5

Powinieneś spróbować dowiedzieć się, skąd pochodzi NullReferenceException. Zmień kod, aby zrozumieć, że pewne rzeczy mogą zwracać wartość null. Na przykład, w

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

HttpContext.Current może retrun null lub .Request może powrócić null lub .ServerVariables["REMOTE_ADDR"] może powrócić puste. Również w

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

GetHostAddresses(strHostName) mógł wrócić null, lub .GetValue(0) mógł wrócić zerowy.

Jeśli metoda lub właściwość może zwrócić wartość null, należy sprawdzić zerowy przed dereferencją. Na przykład:

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. Nie wiem, dlaczego używałbyś GetValue(0). Zamiast tego użyj hostAddresses[0].

+0

NULL odniesienia występuje wtedy, gdy próbuję Request.UserHostAddress lub HttpContext.Current.Request.ServerVariables [ „REMOTE_ADDR”] ja po prostu nie mogę znaleźć się w dowolny sposób na zdobycie klienta IP w moim usługa ASMX. = ( –

+0

@Zain: Tak jak powiedziałem, sprawdź null, zanim użyjesz żadnej z tych wartości .Prawdziwie, przetestuj 'HttpContext.Current', aby sprawdzić, czy jest on pusty, zanim spróbujesz' HttpContext.Current.Request'. –

Powiązane problemy