2016-05-04 2 views
1

Hier ist der Code, den ich verwende, um Bericht von einem SSRS-Server im PDF-Format anzuzeigen.Anstatt Bericht von SSRS-Server in PDF anzuzeigen, zeigt der Browser die unbearbeitete Antwort vom Webserver an

var reportServerUrl = new Uri(string.Format("{0}?{1}{2}&rs:aCommand=Render&rs:Format=pdf", 
      ConfigurationManager.AppSettings("ReportServerURL"), 
      ConfigurationManager.AppSettings("ReportFolder"), ItemPath)); 

var wcli = new WebClient(); 
wcli.Credentials = CustomReportCredentials.WebClientCredentials; 
var fileBuffer = wcli.DownloadData(reportServerUrl); 

if (fileBuffer != null) 
{ 
    Response.ContentType = "application/pdf"; 
    Response.AddHeader("content-length", fileBuffer.Length.ToString()); 
    Response.BinaryWrite(fileBuffer); 
} 

Es funktioniert die meiste Zeit. Aber manchmal, wenn ich auf einen Link klicke, bekomme ich, anstatt einen Bericht im PDF-Format zu bekommen, seltsame Ergebnisse, abhängig vom Browser. In CHROME erhalte ich den Quellcode der Seite. Im IE erhalte ich die rohe Antwort + einige wichtige Zeichen (siehe Bild). Dann läuft die Seite ab.

enter image description here

Ehrlich, ich habe keine Ahnung, warum dies geschieht.

Danke für Ihre Hilfe.

+0

Dies wird normalerweise durch eine Doctype-Einstellung auf dem Server verursacht, wobei der Server nicht weiß, welche Art von Daten er sendet, so dass er Text annimmt. Sie sagen nicht, welchen Webserver Sie verwenden, daher kann ich keine spezifische Lösung vorschlagen. – Duston

+0

Ich verwende die Internetinformationsdienste 8. Die Nebenfrage wäre, warum das Problem nur jedes andere Mal auftritt, d. H. Ich klicke auf den Link, es zeigt den Bericht in PDF an. Das nächste Mal bekomme ich den Fehler. Das nächste Mal zeigt es den Bericht perfekt an, dann erhalte ich den Fehler. Ich bin verloren. – Richard77

+1

Sie tun dies auf Knopfdruck? Ich würde einen Handler erstellen und dann einen Hyperlink verwenden, um die Datei herunterzuladen. wahrscheinlich würde Anhang auf Content-Disposition plus einen Dateinamen, report.pdf oder ähnliches setzen. –

Antwort

1

Was Sie dort sehen, ist eine rohe binäre HTTP-Antwort einschließlich Header und Payload (das ist, was diese seltsamen Zeichen ausmacht) interpretiert als HTML. Ich denke, was Sie vermissen hier ist ein Aufruf an Response.Clear() nach dem Header up Einstellung:

if (fileBuffer != null) 
{ 
    Response.ContentType = "application/pdf"; 
    Response.AddHeader("content-length", fileBuffer.Length.ToString()); 
    Response.Clear(); 
    Response.BinaryWrite(fileBuffer); 
} 

, dies zu tun Andernfalls wird der Webserver des Standard-Header in Ort verlassen.

Nachdem gesagt, dass Sie nicht wirklich die Inhaltslänge Ihrer Nutzlast festlegen müssen. Siehe das Beispiel für Response.Flush().

+0

Kannst du bitte hier schreiben, wie der Code sein sollte? Zumindest die Fixes, die angewendet werden mussten? – Richard77

+0

@ Richard77: Tut mir leid, ich dachte es wäre offensichtlich. Ich habe meine Antwort aktualisiert. – DaSourcerer

+0

Nein, es war nicht offensichtlich für mich. Zum Beispiel habe ich die Zeile entfernt, indem ich die Überschrift wie empfohlen hinzugefügt habe. Außerdem habe ich Response.Flush() hinzugefügt. Jetzt funktionieren die Dinge gut. Ich danke dir sehr. – Richard77