2010-03-17 7 views
18

J'ai travaillé sur le développement d'une application de type intermédiaire, qui télécharge du texte dans un backend CMS en utilisant des requêtes HTTP post pour une série de dates (généralement 7 à la fois). J'utilise HttpWebRequest pour accomplir ceci. Il semble fonctionner correctement pour la première date, mais quand il commence la deuxième date, j'obtiens le System.Net.WebException: La demande a été annulée: La demande a été annulée.HttpWebRequest: La demande a été abandonnée: La demande a été annulée

J'ai cherché et trouvé les grands indices suivants:

http://social.msdn.microsoft.com/Forums/en-US/netfxnetcom/thread/0d0afe40-c62a-4089-9d8b-fb4d206434dc

http://www.jaxidian.org/update/2007/05/05/8

http://arnosoftwaredev.blogspot.com/2006/09/net-20-httpwebrequestkeepalive-and.html

Et ils n'ont pas été trop utile. J'ai essayé de surcharger le GetWebReuqest mais cela n'a pas de sens car je n'utilise pas cette fonction.

Voici mon code: http://pastebin.org/115268

Je reçois l'erreur sur la ligne 245 après qu'il a exécuté avec succès au moins une fois.

J'apprécierais toute aide que je peux obtenir car c'est la dernière étape d'un projet sur lequel je travaille depuis un certain temps. C'est mon premier projet C#/VS donc je suis ouvert à tous les conseils mais je voudrais me concentrer sur la résolution de ce problème en premier.

THanks!

+0

Le lien pastebin est cassé. –

Répondre

15

La solution commune répertoriée sur Internet semble être de définir la propriété KeepAlive de HttpWebRequest sur false. Cela peut résoudre le problème si la cause première est que la connexion devrait être réutilisée même si elle a été fermée automatiquement après un certain temps. Cependant, les performances sont constamment affectées à l'ouverture et à la fermeture des connexions.

Une autre solution possible que j'ai utilisée lorsque j'ai rencontré ce problème était d'étendre les propriétés Timeout: WebRequest.ReadWriteTimeout, WebRequest.Timeout, RequestStream.WriteTimeout et RequestStream.ReadTimeout. S'il vous plaît noter que ceux-ci sont en millisecondes, de sorte que vous pouvez vouloir que les délais d'attente soient de 1000 * 60 * 10 pour représenter 10 minutes (ou seulement 600000 si vous pensez que vous saurez ce que cela signifie ...). Vous pouvez tester si c'est la cause la plus probable du problème en réduisant la taille du fichier.

BTW. Votre code ne figurait plus sur le site Web répertorié. Vous voudrez peut-être l'inclure dans le texte de votre message si le problème persiste.

3

Un bref résumé de mon application: J'ai jusqu'à 16 threads identiques faisant des requêtes HTTP simultanées. Chacun de ces threads demande des serveurs Web différents avec des points de terminaison locaux uniques. Maintenant, la fonction faisant ces appels a 3 requêtes HTTP successives à faire (sur le même serveur web) et faire une certaine agrégation. Basé sur les solutions postées dans les liens ci-dessus, la combinaison suivante a fonctionné pour moi.

System.Net.ServicePointManager.DefaultConnectionLimit = 200; 
System.Net.ServicePointManager.MaxServicePointIdleTime = 2000; 
System.Net.ServicePointManager.MaxServicePoints = 1000; 
System.Net.ServicePointManager.SetTcpKeepAlive(false, 0, 0); 

HttpWebRequest webRequest1 = (HttpWebRequest)WebRequest.Create("http://" + gatewayIP 
+ "/xslt?"); 
webRequest1.KeepAlive = false; 
webRequest1.Timeout = 2000; 
//Do other stuff here... 
//Close response stream 

Thread.Sleep(1000); //This delay seems to help. Obviously very specific to the server 

HttpWebRequest webRequest2 = (HttpWebRequest)WebRequest.Create("http://" + gatewayIP 
+ "/xslt?"); 
webRequest2.KeepAlive = false; 
webRequest2.Timeout = 2000; 
//Do other stuff here... 
//and so on... 
+1

Vous ne devriez jamais avoir besoin de sommeil entre les appels. Si le délai d'attente sur les demandes n'est pas assez important (2000 en millisecondes est seulement 2 secondes), vous devez les agrandir, dans des limites raisonnables. Et faites attention aux performances que vous pouvez obtenir avec KeepAlive = false que d'autres ont mentionné si vous faites un grand nombre d'appels HTTP. – MonkeyWrench

12

est ici la seule solution fonctionne pour moi:

http://blogs.msdn.com/b/johan/archive/2006/11/15/are-you-getting-outofmemoryexceptions-when-uploading-large-files.aspx

Ces lignes sont la clé:

HttpWebRequest wr = (HttpWebRequest)WebRequest.Create(yourUri); 
    wr.KeepAlive = false; 
    wr.Timeout = System.Threading.Timeout.Infinite; 
    wr.ProtocolVersion = HttpVersion.Version10; 

Et ici:

wr.AllowWriteStreamBuffering = false; 
+9

'Infinite' est assez long. :) – dotNET

Questions connexes