Ich habe eine Legacy-Anwendung geerbt, die eine On-the-Fly-PDF von einem Reporting Services Server greifen soll. Alles funktioniert gut, bis zu dem Punkt, an dem Sie versuchen, die zurückgegebene PDF-Datei zu öffnen, und Adobe Acrobat Sie darauf hinweist:
Adobe Reader konnte nicht geöffnet werden thisStoopidReport'.pdf' nicht öffnen, weil die Datei entweder kein unterstützter Dateityp ist oder weil die Datei beschädigt wurde (zum Beispiel zum Beispiel als E-Mail gesendet wurde Anhang versandt und nicht korrekt dekodiert).
Ich habe eine erste Fehlersuche in dieser Sache durchgeführt. Wenn ich die URL im Aufruf WebRequest.Create() durch eine gültige PDF-Datei auf meinem lokalen Rechner ersetze (z. B. @"C:temp/validpdf.pdf"), erhalte ich eine gültige PDF-Datei.
Der Bericht selbst scheint gut zu funktionieren. Wenn ich die URL des Berichts, der die PDF-Datei erzeugen soll, manuell eingebe, werde ich zur Benutzerauthentifizierung aufgefordert. Aber nachdem ich sie eingegeben habe, erhalte ich eine gültige PDF-Datei.
Ich habe die tatsächlichen Strings url, username, userpass und domain im unten stehenden Code aus offensichtlichen Gründen durch gefälschte Werte ersetzt.
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();