2016-03-23 3 views
0

J'ai une application de console qui fait des appels aux serveurs. Je compris que je manqué de mettre cela en utilisant statment et une fois que je l'ai fait que je continuais à obtenir cette erreur:Comment résoudre "impossible d'accéder à l'objet éliminé System.net.HttpWebResponse"?

"Cannot access a disposed object.\r\nObject name: 'System.Net.HttpWebResponse'."

Après Google J'ai essayé quelques tentatives, l'un de l'être:

<system.net> 
    <settings> 
     <httpWebRequest useUnsafeHeaderParsing="true" /> 
    </settings> 
    </system.net> 

dans l'application .config

Je reçois toujours la même erreur et je ne sais pas pourquoi, mon code:

public static HttpWebResponse CallServer(string url) 
{ 
    var request = (HttpWebRequest)WebRequest.Create(url); 
    var webResp = (HttpWebResponse)null; 
    using (webResp = (HttpWebResponse)request.GetResponse()) 
    { 

    } 

    return webResp; 
} 

Comment résoudre ce problème?

Répondre

2

Votre using (webResp ...) provoque l'élimination de la réponse à la fin de l'instruction using. Accéder à la réponse après cela échouera.

La solution facile est de retarder l'élimination du webResp jusqu'à ce que vous en ayez fini avec lui. Vous pouvez le disposer dans la méthode recevant webResp.

Je suppose que vous devez créer un using un peu comme ceci:

using (HttpWebResponse x = CallServer(url)) 
{ } 

et retirez la using dans la méthode CallServer.

+0

Merci @Patrick Hofman – ThunD3eR

1

Le compilateur traduit la déclaration using à quelque chose comme ceci:

HttpWebResponse webResp; 
try 
{ 
    webResp = (HttpWebResponse)request.GetResponse(); 
} 
finally 
{ 
    webResp.Dispose(); 
} 

Donc, si vous voulez revenir webResp et utiliser cet objet en dehors de votre méthode, vous ne devez pas le mettre dans une déclaration using, parce que using sera Dispose l'objet. Et vous ne pouvez pas utiliser un objet disposé (comme l'indique clairement le message d'exception).

Vous vouliez probablement envelopper votre appel à CallServer dans un communiqué using:

using (HttpWebResponse webResp = CallServer("http://...")) 
{ 
    // do something with your response 
} 
+0

merci! m'a donné quelques alternatives pour aller avec – ThunD3eR