2009-06-22 4 views
1

Grundsätzlich muss ich Dateien von einem Ort liefern, der Windows-Authentifizierung erfordert. Anstatt meinen Kunden direkt damit zu beschäftigen, möchte ich einen Prozess implementieren, so dass sie die Dateien einfach so herunterladen können, als wären sie auf meinem Server, nachdem sie sich natürlich in meinem System angemeldet haben. Hier ist, was ich bisher, das scheint nicht richtig zu funktionieren:Wie lade ich eine Datei herunter und serviere sie sofort an den Client in 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(); 

Wenn ich versuche, das ich bin in der Lage, die Datei zu sehen, aber etwas stimmt nicht mit der Codierung oder dem Inhaltstyp und für Beispiel: Eine PDF enthält 16 leere Seiten (anstelle von 16 Seiten Text).

Irgendeine Idee was vermisse ich?

Spüren Sie den Titel dieser Frage zu ändern frei, wenn es eine bessere Art und Weise der Phrasierung diese Frage

-Update ist: die beiden Antworten unten, aber ohne Glück versucht. Ich denke jetzt, dass der Inhaltstyp und die Codierung in Ordnung sind, aber vielleicht schlägt die Authentifizierung fehl? Die Inhaltslänge ist viel kleiner als es eigentlich sein sollte ... Benutze ich die falsche Methode für die Windows-Authentifizierung?

+0

Sie sollten überprüfen, was Sie von der inneren Anforderung zurück erhalten. Vielleicht erhalten Sie HTML in Form einer Fehlerseite vom Server zurück. – Jacob

Antwort

1

Je nachdem, wie/was Sie haben. Ich würde ein paar Dinge tun.

Response.Clear() zunächst alle zu entfernen, die möglicherweise gerendert wurden.

Ich würde dann eine Kopfzeile hinzufügen, mit Content-Disposition-Set und senden Sie es als eine tatsächliche Anlage, anstatt nur an den Benutzer schreiben.

+0

Ich habe versucht, Response.Clear() direkt vor meine Anrufe zu setzen, und es scheint nicht zu helfen. Ich habe den Header noch nicht probiert. –

+0

Kein Würfel. Content_Disposition funktioniert auch nicht. Hast du noch was auf dem Ärmel? –

+0

Was ich jetzt versuchen würde, ist das Problem zu isolieren. Versuchen Sie, die Antwort zu speichern, und stellen Sie sicher, dass Sie die Datei zuerst erhalten. Dann, wenn Sie sind, bearbeiten Sie den Antwortteil. –

1

Es sieht so aus, als ob Sie den falschen Inhaltstyp in Ihrem letzten Codeblock senden. Sie senden den Typ der ursprünglichen Anfrage des Benutzers anstelle des Inhaltstyps der Datei, die Sie abgerufen haben. Ändern Sie dies:

Response.ContentType = request.ContentType; 

zu:

Response.ContentType = response.ContentType; 
+0

Nein, kein Glück. Es stellt den Inhaltstyp korrekt ein, aber wenn ich die Header über die FireFox Web Developer Toolbar überprüfe, ist es auf text/html ... seltsam eingestellt. –

+0

Vielleicht erhalten Sie eine Text/HTML-Fehlerseite zurück. Sie sollten in der Lage sein zu überprüfen, was Sie zurück in den Antwortstream während des Debuggen erhalten oder Wireshark verwenden, um sicher zu wissen. – Jacob

0

Wenn Ihr Problem mit den Netzwerkanmeldeinformationen zusammenhängt, möchten Sie vielleicht einen anderen Ansatz ausprobieren. Wenn Sie der Anwendung, die der Anwendungspool der Website verwendet, HTTP-Zugriff gewähren, können Sie die Angabe der Benutzername/Kennwort-Anmeldeinformationen in der Anforderung vermeiden. Dies bietet Ihnen auch den zusätzlichen Vorteil, dass Sie das Passwort nicht irgendwo speichern müssen.

Verwandte Themen