8
votes

L'opération a choisi avec webclient.downtowloadfile et corrige d'URL

Je suis des produits de téléchargement par lots vers une base de données.

Je télécharge les URL de l'image sur le site à utiliser pour les produits.

Le code que j'ai écrit fonctionne bien pour les 25 premières itérations ( Toujours ce numéro pour une raison quelconque), mais me jette ensuite un système.net.webException "L'opération a expiré". xxx

J'ai vérifié l'URL distante qui demandait et C'est une URL de l'image valide qui renvoie une image.

En outre, lorsque je le traverse avec le débogueur, je ne reçois pas l'erreur de délai d'attente.

Aide! ;)


1 commentaires

Il semble que lorsque je traverse le débogueur, je ne reçois pas l'erreur de délai d'attente. Une raison pour laquelle?


4 Réponses :


20
votes

Si j'étais à votre place, voici quelques possibilités d'enquête:

  • Si vous exécutez ce code à partir de plusieurs threads, vous pouvez heurter contre la propriété System.NET.ServicePointManager.defaultConnectionLimit. Essayez de l'augmenter à 50-100 lorsque vous démarrez votre application. Notez que je ne pense pas que ce soit votre problème, mais essayez ceci est plus facile que les autres trucs ci-dessous. : -)
  • Une autre possibilité est que vous submergez le serveur. Cela est généralement difficile à faire avec un client à une seule-filetage, mais est possible car plusieurs autres clients peuvent également frapper le serveur. Mais comme le problème se produit toujours au n ° 25, cela semble improbable car vous vous attendiez à voir plus de variation.
  • Vous pouvez rencontrer un problème avec Keepalive HTTP Connections Sauvegardez-vous entre votre client et le serveur. Cela semble également peu probable.
  • Le seuil difficile de 25 me fait penser que cela peut être une limite de proxy ou de pare-feu, soit sur votre fin, soit sur votre fin, soit sur votre part, soit> 25 connexions fabriquées à partir d'une adresse IP client sur un serveur (ou un proxy) sera étrangère. < / li>

    Mon argent est sur ce dernier, puisque le fait qu'il se brise toujours à un beau nombre de demandes ronds et que le débogueur (aka plus lentement!) Ne déclenche pas le problème.

    Pour tester tout cela, je commencerais avec la chose facile: Collez-vous dans un délai (thread.sleep) avant chaque appel HTTP et voyez si le problème disparaît. Si cela le fait, réduisez le retard jusqu'à ce que le problème revienne. Si ce n'est pas le cas, augmentez le retard jusqu'à un grand nombre (par ex. 10 secondes) jusqu'à ce que le problème disparaisse. Si cela ne disparaît pas avec un délai de 10 secondes, c'est vraiment un mystère et j'aurais besoin de plus d'informations pour diagnostiquer.

    Si cela disparaît avec un retard, vous devez déterminer pourquoi ... et si la limite est permanente (pare-feu de Server par exemple que vous ne pouvez pas changer) ou quelque chose que vous pouvez changer. Pour obtenir plus d'informations, vous voudrez checter les demandes (par exemple, chèque DateTime .now avant et après chaque appel) pour voir si vous voyez un motif. Si les horaires sont tous cohérents et deviennent soudainement énormes, cela suggère un réseau de réseaux / pare-feu / proxy. Si les horaires augmentent progressivement, cela suggère un serveur que vous surchargez et allongez progressivement sa file d'attente de demande.

    En plus de chronométrer les demandes, je définirais le délai d'attente de vos appels WebClient pour être plus long, de sorte que vous puissiez déterminer si le délai d'attente est infini ou juste un peu plus long que la valeur par défaut. Pour ce faire, vous aurez besoin d'une alternative à la classe WebClient, car elle ne prend pas en charge un délai d'attente. Ce fil sur Les forums MSDN ont un échantillon de code alternatif raisonnable.

    Une alternative à ajouter de la synchronisation dans votre code consiste à utiliser Fiddler:

    • Téléchargez Fiddler et démarrez-le.
    • Définissez la propriété proxy de votre code WebClient pour pointer vers le proxy Fiddler (localhost: 8888)
    • Exécutez votre application et regardez le Fiddler.

3 commentaires

D'accord, cela ressemble vraiment à un problème de connexion de connexion. Cela pourrait également expliquer pourquoi le débogueur "corrige", car certaines connexions sont libérées pendant que le développement est assis dans le débogueur.


J'avais également recommandé d'utiliser "CARDPORTS" utilitaire ( NIRSOFT.net/utils/cports.htmlLec A>) qui affichera des connexions actuellement ouvertes dans une belle interface graphique (ou vous pouvez utiliser la commande NetStat "intégrée de Windows).


Augmenter le system.net.servicepointManager.defaultconnectionlimit a-t-il fait pour moi (j'utilise téléchargementfile dans les threads). Le Valeur par défaut < / a> est 2.



6
votes

Il semble que webclient ne ferme pas la réponse objet Il utilise une fois fait ce qui provoquera, dans votre cas, de nombreuses réponses à ouvrir en même temps et avec Une limite de 25 connexions sur le serveur distant, vous avez eu la «exception du délai d'attente». Lorsque vous déboguez, des réponses ouvertes précoces sont fermées en raison de leur délai intérieur, etc. (I inpected webclient qu'avec le réflecteur, je ne trouve pas d'instruction pour la fermeture de la réponse).

I PROPSE que vous utilisez httpwebrequest & httpwebresponse afin que vous puissiez Nettoyer les objets après chaque téléchargement: xxx


0 commentaires


3
votes

J'ai le même problème et je résous cela ajoutant ces lignes au fichier de configuration app.config: xxx


0 commentaires