Question

J'ai le code suivant pour le téléchargement de fichier:

        FileInfo fileInfo = new FileInfo(filePath);

        context.Response.Clear();
        context.Response.ContentType = "application/octet-stream";
        context.Response.AddHeader("Content-Disposition", "attachment; filename=" + System.IO.Path.GetFileName(filePath));
        context.Response.AddHeader("Content-Length", fileInfo.Length.ToString());
        context.Response.WriteFile(filePath);
        context.Response.End();

Lorsque je l'exécute sur mon IIS6 local, cela fonctionne bien. Navigateur Web (testé sur IE8, Firefox 3.5.2, Opera 10) indique la longueur du fichier avant que je ne commence à télécharger le fichier.

Lorsque j'exécute ce code sur IIS7 distant, le navigateur Web n'affiche pas la longueur du fichier. La longueur du fichier est inconnue.

Pourquoi le fichier n'est-il pas long lorsque ce code est exécuté sous IIS7?

Était-ce utile?

La solution

Utilisez Fiddler pour vérifier ce qui est réellement envoyé. Je suppose que vous obtenez un codage fragmenté suite à la définition de la mise en mémoire tampon sur false sur le serveur IIS7.

BTW, laissez tomber le Response.End appeler c'est une chose assez traumatisante à faire et est inutile (d'ailleurs l'appel à Clear).

Modifier

À proprement parler, lorsque vous diffusez du contenu avec un codage en bloc (ce qui est souhaitable dans votre scénario), l'en-tête Content-Length ne doit pas être présent (voir RFC2616 Section 4.4 .) Il me semble qu'IIS7 se charge de le faire respecter. En fait, j'ai eu un scénario Classic-ASP dans lequel IIS7 génère une erreur lorsque le code COM tente d'ajouter un en-tête Content-Length lorsque la mise en mémoire tampon est désactivée.

C’est vraiment ennuyeux car, malgré ce que souhaite le comité des tours d’ivoire, cet en-tête offre à l’utilisateur final une information très utile.

Autres conseils

Merci pour ce post .... je l'ai obtenu pour IE avec la première ligne.

public void WriteCSV(string strData) {
   //Required for IIs7 WS2008R2 fix
   Response.ClearHeaders();
   Response.Clear();


   Response.Buffer = true; 
   Response.ContentType = "application/csv";
   Response.AddHeader("Content-Disposition", "attachment;filename=report.csv");
   Response.Write(strData);
   Response.Flush();
   Response.End();
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top