7
votes

Big Files Téléchargement (WebException: la connexion a été fermée de manière inattendue)

mis à jour

voir message # 3 ci-dessous.

Il est nécessaire de télécharger un fichier sur le Web automatiquement (sans navigateur). Host - Mini Fichier hôte V1.2 (si cela importe). N'a pas trouvé d'API spécifique dans la documentation, donc au début, j'ai reniflé les demandes de navigateur en Firebug comme suit: xxx

ici, nous pouvons voir le paramètre, les en-têtes, le type de contenu et les morceaux d'informations (1 - Nom de fichier et type, 2 - Contenu de fichier, 3 - paramètres supplémentaires - Description et mot de passe, pas nécessairement appliqué). Donc, j'ai créé une classe qui émule un tel comportement étape par étape: httpwebrequest sur l'URL, appliquez les paramètres nécessaires à la demande, formulez des chaînes de demande avec StringBuilder et de les convertir en billets d'octet, lisez un fichier à l'aide de FileStream, mettez tout ce type à Morthstream, puis l'écrivant à la demande (a pris une partie majeure d'un code d'un article à CodeProject où il télécharge un fichier à Host Rapidshare). Neat et bien rangé, mais ... ça ne semble pas fonctionner :(. En conséquence, il renvoie la page de téléchargement initial, pas une page de résultat avec des liens que je pourrais analyser et présenter à un utilisateur ... Voici les principales méthodes d'une classe de téléchargeur: xxx

joue avec protocolversion (1.0, 1.1), allowautoredirect (véritable / faux), même connu Servicepoint.Expect100Continuer (Faux). t corriger un problème. Même un délai d'attente de 5sec avant d'obtenir une réponse (pensée en cas de gros fichier qu'il ne télécharge pas aussi vite) n'a pas aidé. Type de contenu "Stream d'octet" a été choisi par but de télécharger n'importe quel fichier (pourrait utiliser un commutateur pour le plus populaire JPG / ZIP / RAR / DOC, etc., mais celui-ci semble universel). La limite est générée au hasard des tiques de minuterie, pas une grosse affaire. Quoi d'autre? : / Je pourrais abandonner et oublier ça, mais je sens que je suis assez proche de résoudre et alors oubliez-le: p. Si vous auriez besoin de l'ensemble de l'application pour exécuter et déboguer - ici, il est (70 Ko, une solution zippée C # 2.0 VS2K8, aucune annonce, aucun virus):

@ Mediafire @fileqube @FileDropper


2 commentaires

Que voulez-vous dire avec "Affiche la page principale d'un hôte"? Pouvez-vous élaborer sur l'erreur réelle que vous obtenez? Qu'est-ce qui ne fonctionne pas exactement?


La page avec la zone "Choisir un fichier" et le bouton de téléchargement: i.piccy.info/ I3 / 74 / B5 / 3089A82AA091A0D975B987F1bedd.png Pas une page avec des liens vers un fichier: i.piccy.info/i3/30/48/b66db6dee2e353949bd5d5269557.png Je pense que quelque chose ne fonctionne pas sur l'étape où les données sont envoyées et que nous obtenons des résultats. Redirection n'arrive pas, même avec ApubAutoredirect Param = Cookiecontainer Vrai et initialisé.


4 Réponses :


0
votes

"En conséquence, il renvoie la page de téléchargement initial, pas une page de résultat avec des liens que je pourrais analyser et présenter à un utilisateur ..."

Peut-être que c'est juste le comportement de la fonctionnalité de téléchargement: qu'après le téléchargement terminé, vous pouvez télécharger un autre fichier? Je pense que vous devez appeler une autre URL pour le «Parcourir pour le fichier» (je suppose que c'est celui dont vous avez besoin).


EDIT : En réalité, si le serveur envoie une "redirection" (http 3xx), c'est quelque chose que le navigateur doit gérer, donc si vous travaillez avec votre propre application client à la place d'un Navigateur, vous devrez mettre en œuvre la redirection vous-même. Ici, le RFC pour plus d'informations.


2 commentaires

La vérité est quelque part là-bas ... Le scénario d'utilisation commun d'un service étape par étape est la suivante: 1) la page de la page de service de chargement de la page de chargement ahost.com (en fait quelqueièmement.com/index.php); 2) choisir un fichier à télécharger via la boîte de dialogue Parcourir et Fichier Ouvrir; 3) Cochez la case "Accepter to Terming Service" pour activer le bouton de téléchargement (en cas de non-navigateur, cela n'affecte rien je suppose?) 4) Hit "Télécharger!" 5) Attendez que le fichier télécharger sur le même emplacement (juste une partie de la barre de progression JS affichée via le formulaire, / Ignorer) 6) Voir et copier des liens vers un fichier et «Supprimer le fichier». L'adresse est quelqueiège.com/upload.php?d=verify.


Le fait est d'obtenir le contenu d'une page avec des liens, un simple téléchargement de fichier multiplier est inutile si nous ne pouvons pas les trouver après le téléchargement. Appelant "CORRECT" Page logique, mais "upload.php? Do = Verify" est générée uniquement après la demande de demande et la navigation manuelle à celle-ci nous donne une erreur "Aucun fichier choisi".



11
votes

Mise à jour: Nope, il n'y a pas de redirection.

Capture d'écran a > p>

lire RFC2388 quelques fois, réécrivez le code et enfin Travaillé (je suppose que le problème était dans la limite de fin de la lecture UTF au lieu de corriger 7 bits ASCII). Hourraille? NOPE :( P>

1) Augmente à la fois le délai d'attente et READWRITETIMEOut de la demande p>

2) Attribuer une requête.keekeealive = false et system.net.servicePoint100Continue = false p>

3) Définir Protocolversion sur 1.0 Mais ni l'un d'entre eux ni tous totalement aident dans mon cas. TOUTES IDÉES? P>

EDIT STRORT> - Code source: P>

// .. request created, required params applied
httpWebRequest.ProtocolVersion = HttpVersion.Version10; // fix 1
httpWebRequest.KeepAlive = false; // fix 2
httpWebRequest.Timeout = 1000000000; // fix 3
httpWebRequest.ReadWriteTimeout = 1000000000; // fix 4
// .. request processed, data written to request stream
string strResponse = "";            
try
{
    using (WebResponse httpResponse = httpWebRequest.GetResponse()) // error here
        {
            using (Stream responseStream = httpResponse.GetResponseStream())
            {
                using (StreamReader streamReader = new StreamReader(responseStream))
                    {
                        strResponse = streamReader.ReadToEnd();
                    }
                }
            }
        }
catch (WebException exception)
{
    throw exception;
}


2 commentaires

Sur certains hôtes, le code travaille, sur certains, pas ... Je pense que je peux quitter ce qui précède. Le seul point intéressant que j'ai - comment mettre en œuvre la progression du téléchargement.


demande.keekeealive = false et system.net.servicepointManager.expect100Continue = false a travaillé pour moi



0
votes

Essayez de définir la propriété MaxRequestLength de l'élément HTTPRuntime dans le Web.config.


0 commentaires

0
votes

Dans mon cas, nom de fichier en double causant également le problème. Je sauvegarde les paramètres du fichier dans un fichier XML, mais le paramètre Nom se fait dupliquer.

dataStream.Write(filesBytesArray, 0, filesBytesArray.Length);
dataStream.Close();


0 commentaires