2009-06-22 7 views
1

Fondamentalement, j'ai besoin de servir des fichiers à partir d'un emplacement qui nécessite une authentification Windows. Au lieu d'avoir directement affaire à mon client, je voudrais mettre en place un processus pour qu'ils puissent simplement télécharger les fichiers comme s'ils étaient sur mon serveur, après qu'ils se soient connectés à mon système, bien sûr. Voici ce que j'ai jusqu'à présent, ce qui ne semble pas fonctionner correctement:Comment télécharger un fichier et le servir immédiatement au client dans ASP.NET?

// Create the request 
WebRequest request = HttpWebRequest.Create(button.CommandArgument); 
request.Credentials = new NetworkCredential(_username,_password); 


// Get the response 
WebResponse response = request.GetResponse(); 
StreamReader responseStream = new StreamReader(response.GetResponseStream()); 

// Send the response directly to output 
Response.ContentEncoding = responseStream.CurrentEncoding; 
Response.ContentType = request.ContentType; 
Response.Write(responseStream.ReadToEnd()); 
Response.End(); 

Lorsque je tente cela, je suis en mesure de voir le fichier, mais quelque chose ne va pas avec l'encodage ou le type de contenu et, pour Par exemple, un PDF contiendra 16 pages vierges (au lieu de 16 pages de texte).

Une idée de ce qui me manque?

Ne hésitez pas à changer le titre de cette question s'il y a une meilleure façon de formuler cette question

Mise à jour: Essayé les deux réponses ci-dessous, mais sans succès. Je pense maintenant que le type de contenu et l'encodage sont OK, mais peut-être l'authentification échoue? La longueur du contenu est beaucoup plus petite qu'elle ne devrait l'être ... Suis-je en utilisant la mauvaise méthode pour l'authentification Windows?

+0

Vous devriez inspecter ce que vous obtenez de la demande intérieure. Peut-être que vous récupérez HTML sous la forme d'une page d'erreur du serveur. – Jacob

Répondre

1

Selon la/ce que vous avez. Je ferais quelques choses. Tout d'abord pour supprimer tout ce qui aurait pu être rendu.

Je voudrais alors ajouter un en-tête, avec un ensemble de disposition de contenu et l'envoyer comme une pièce jointe réelle, plutôt que de simplement l'écrire à l'utilisateur.

+0

J'ai essayé de mettre Response.Clear() juste avant mes appels, et cela ne semble pas aider. Je n'ai pas encore essayé l'en-tête. –

+0

Pas de dés. Content_Disposition ne fonctionne pas non plus. Vous avez autre chose dans votre manche? –

+0

Ce que je voudrais essayer maintenant, est d'isoler le problème. Essayez d'enregistrer la réponse, et assurez-vous d'obtenir le fichier en premier. Alors si vous êtes, travaillez sur la partie réponse. –

1

Il semble que vous envoyiez le mauvais type de contenu dans votre dernier bloc de code. Vous envoyez le type de demande d'origine de l'utilisateur au lieu du type de contenu du fichier que vous avez récupéré. Changer ceci:

Response.ContentType = request.ContentType; 

à:

Response.ContentType = response.ContentType; 
+0

Non, pas de chance. Il définit correctement le type de contenu, mais lorsque je vérifie les en-têtes via la barre d'outils du développeur Web FireFox, sa valeur est text/html ... bizarre. –

+0

Peut-être que vous obtenez une page d'erreur texte/html. Vous devriez être en mesure d'inspecter ce que vous récupérez dans le flux de réponse pendant le débogage ou utiliser Wireshark pour être sûr. – Jacob

0

Si votre problème est lié aux informations d'identification réseau, vous pouvez essayer une approche différente. Si vous accordez un accès HTTP à l'identité que le pool d'applications du site Web utilise, vous pouvez éviter d'avoir à spécifier les informations d'identification de nom d'utilisateur/mot de passe dans la demande. Cela vous donne également l'avantage de ne pas avoir besoin de stocker le mot de passe quelque part.