2010-03-28 4 views
7

J'utilise les services Web ASP.NET (.asmx) avec Silverlight. Comme il n'y a aucun moyen de trouver l'adresse IP du client dans Silverlight, j'ai dû me connecter à la fin du service. Ce sont des méthodes que j'ai essayé:Adresse IP du client dans les services 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(); 

Toutes les méthodes ci-dessus fonctionnent très bien sur mon système local, mais quand je publie mon service sur un serveur de production, il commence à donner des erreurs,

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

Répondre

2

Si vous jetez un oeil à l'aide réflecteur au code System.Web.Hosting.ISAPIWorkerRequestInProc.GetAdditionalServerVar, c'est ce que nous voyons:

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

Je vois deux raisons pour lesquelles cela pourrait soulever un NullReferenceException:

1) il y a un problème de multithreading sur le membre _additionalServerVars. Je ne pense pas que cela puisse arriver car A) Je ne vois pas pourquoi il y aurait une grosse charge sur votre serveur pendant le test, et B) l'instance de ISAPIWorkerRequestInProc est probablement liée à un thread. 2) votre serveur n'est pas à jour et le code en production n'est pas le même que celui que je vois sur mon ordinateur.

Donc, ce que je ferais est de vérifier que le serveur est à jour avec les DLL .NET Framework.

5

Vous devriez essayer de savoir exactement d'où vient le NullReferenceException. Changez votre code pour comprendre que certaines choses peuvent retourner null. Par exemple, dans

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

HttpContext.Current pourrait retrun nulle ou .Request pourrait retourner nulle ou .ServerVariables["REMOTE_ADDR"] pourrait retourner null. En outre, dans

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

le GetHostAddresses(strHostName) pourrait retourner nulle ou l'.GetValue(0) pourrait retourner null.

Si une méthode ou une propriété peut renvoyer une valeur nulle, vous devez vérifier null avant de le déréférencer. Par exemple,

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. Je ne sais pas pourquoi vous utiliseriez GetValue(0). Utilisez hostAddresses[0] à la place.

+0

NULL Exception Référence se produit lorsque je tente Request.UserHostAddress ou HttpContext.Current.Request.ServerVariables [ « REMOTE_ADDR »] Je viens ne peux pas trouver toute façon d'obtenir le client IP dans mon service asmx. = ( –

+0

@Zain: Comme je l'ai dit, vérifiez null avant d'utiliser l'une de ces valeurs.En fait, assurez-vous de tester 'HttpContext.Current' pour voir si elle est nulle avant d'essayer' HttpContext.Current.Request'. –