2010-03-28 45 views
7

Tôi đang sử dụng dịch vụ web ASP.NET (.asmx) với Silverlight. Vì không có cách nào để tìm địa chỉ IP của máy khách trong Silverlight, tôi phải đăng nhập vào cuối dịch vụ. Đây là một số phương pháp tôi đã cố gắng:Địa chỉ IP của khách hàng trong 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(); 

Tất cả các phương pháp trên hoạt động tốt trên hệ thống địa phương của tôi, nhưng khi tôi xuất bản dịch vụ của tôi trên máy chủ sản xuất, nó bắt đầu đưa ra các lỗi,

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

Trả lời

2

Nếu bạn có một cái nhìn sử dụng Reflector vào mã System.Web.Hosting.ISAPIWorkerRequestInProc.GetAdditionalServerVar, đó là những gì chúng ta thấy:

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

tôi thấy hai lý do tại sao điều này có thể nâng cao một NullReferenceException:

1) có một vấn đề đa luồng trên thành viên _additionalServerVars. Tôi không nghĩ rằng điều này có thể xảy ra bởi vì A) Tôi không thấy lý do tại sao sẽ có tải trọng lớn trên máy chủ của bạn trong khi thử nghiệm, và B) dụ ISAPIWorkerRequestInProc có thể gắn liền với một chủ đề.

2) máy chủ của bạn không cập nhật và mã trong sản xuất không giống với mã tôi đang xem trên máy của mình.

Vì vậy, những gì tôi sẽ làm là kiểm tra máy chủ đảm bảo rằng nó được cập nhật với các dlls .NET Framework.

5

Bạn nên cố gắng tìm ra chính xác vị trí của NullReferenceException. Thay đổi mã của bạn để hiểu rằng một số thứ nhất định có thể trả về giá trị rỗng. Ví dụ, trong

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

HttpContext.Current thể retrun null, hoặc .Request có thể trở lại null, hoặc .ServerVariables["REMOTE_ADDR"] có thể trở lại null. Ngoài ra, trong

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

các GetHostAddresses(strHostName) có thể trở lại null, hoặc .GetValue(0) có thể trở lại null.

Nếu một phương thức hoặc thuộc tính có thể trả về giá trị rỗng, thì bạn nên kiểm tra null trước khi hủy bỏ nó. Ví dụ:

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. Tôi không biết tại sao bạn nên sử dụng GetValue(0). Sử dụng hostAddresses[0] để thay thế.

+0

NULL Reference ngoại lệ xảy ra khi tôi cố gắng Request.UserHostAddress hoặc HttpContext.Current.Request.ServerVariables [ "REMOTE_ADDR"] Tôi chỉ không thể tìm ra cách nào để có được những khách hàng IP phục vụ asmx tôi. = ( –

+0

@Zain: Giống như tôi đã nói, hãy kiểm tra null trước khi bạn sử dụng bất kỳ giá trị nào trong số này. Trên thực tế, hãy chắc chắn kiểm tra 'HttpContext.Current' để xem nếu nó là null trước khi bạn thử' HttpContext.Current.Request'. –

Các vấn đề liên quan