Reporting Services als PDF über WebRequest in C# 3.5 "Nicht Unterstützter Dateityp"
Habe ich geerbt, eine legacy-Anwendung soll das grab ein on-the-fly pdf-Datei von einem reporting services-server. Funktioniert alles einwandfrei bis zu dem Punkt, wo Sie versuchen, öffnen Sie die pdf-Datei zurückgegeben wird, und adobe acrobat sagt Sie:
Adobe Reader konnte nicht öffnen
'thisStoopidReport'.pdf', weil es ist
entweder ist keine unterstützte Dateityp oder
weil die Datei beschädigt wurde(für
war es zum Beispiel als email versenden
Anlage und war nicht korrekt
decodiert).
Ich habe einige anfängliche Fehlersuche in dieser. Wenn ich ersetzen Sie die url in die WebRequest.Create () - Aufruf mit einer gültigen pdf-Datei auf meinem lokalen Rechner ie: @"C:temp/validpdf.pdf") dann bekomme ich eine gültige PDF-Datei.
Den Bericht selbst scheint gut zu funktionieren. Wenn ich manuell geben Sie die URL für die reporting services-Bericht, der erzeugt werden sollte, die pdf-Datei werde ich aufgefordert, für die Authentifizierung der Benutzer. Aber nach der Lieferung es ich um eine gültige pdf-Datei.
Habe ich ersetzen Sie den tatsächlichen url,username,userpass und domain, die Zeichenfolgen in den folgenden code mit Schein-Werte aus offensichtlichen Gründen.
WebRequest request = WebRequest.Create(@"http://x.x.x.x/reportServer?/reports/reportNam&rs:format=pdf&rs:command=render&rc:parameters=blahblahblah");
int totalSize = 0;
request.Credentials = new NetworkCredential("validUser", "validPass", "validDomain");
request.Timeout = 360000; //6 minutes in milliseconds.
request.Method = WebRequestMethods.Http.Post;
request.ContentLength = 0;
WebResponse response = request.GetResponse();
Response.Clear();
BinaryReader reader = new BinaryReader(response.GetResponseStream());
Byte[] buffer = new byte[2048];
int count = reader.Read(buffer, 0, 2048);
while (count > 0)
{
totalSize += count;
Response.OutputStream.Write(buffer, 0, count);
count = reader.Read(buffer, 0, 2048);
}
Response.ContentType = "application/pdf";
Response.Cache.SetCacheability(HttpCacheability.Private);
Response.CacheControl = "private";
Response.Expires = 30;
Response.AddHeader("Content-Disposition", "attachment; filename=thisStoopidReport.pdf");
Response.AddHeader("Content-Length", totalSize.ToString());
reader.Close();
Response.Flush();
Response.End();
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ansicht der pdf-Datei, die Sie zurück in notepad.exe. Ich vermute, dass Sie werden sehen, auch in HTML gibt. Wenn Sie eine Webseite aufrufen, die ein pass durch die Seite, dass der Server eine pdf-Datei. Der web-request wird wieder die HTML nicht die PDF-Datei.
Wenn Sie rufen eine Webseite, die eine pdf-Datei direkt, wie http://www.somesite.com/file.pdf Ihr code funktioniert. Das problem ist, dass Sie wahrscheinlich ein pass durch die web-Seite, die versteckt den wahren Speicherort der pdf-Datei.
Die Art, wie ich bekommen haben, um dieses war es, erstellen Sie eine ISAPI-DLL, die erlaubt, Sie zu übergeben in den Parametern, die Sie benötigen, um zu bestimmen, welche pdf-Datei gesendet werden müssen, zurück. Als die ISAPI-DLL würde stream der pdf-Datei mit einem content-Typ "application/pdf".
Diejenigen von Ihnen, schlug vor, das problem war der HTML-kommt wieder aus der URL wies mich in die richtige Richtung. In der Tat, erkannte ich, dass die ursprünglichen Programmierer hier verwendet die PUT "statt" GET " - Methode.
Also durch die Korrektur der einzelnen Zeile:
Nun ist alles coming up roses... err pdf - ... was auch immer es funktioniert.
Danke für den Hinweis mich in die richtige Richtung. Manchmal ist es dauert nur einen zweiten Satz von Augen.
Könnte dein problem verursacht werden, durch die Erklärung Ihrer byte-array zu einer Länge von 2048 anstatt auf Basis der Länge auf die Länge des Streams zurückgegeben GetResponseStream()?