Ich habe eine Legacy-Anwendung geerbt, die ein on-the-fly-PDF von einem Reporting Services-Server erfassen soll. Alles funktioniert gut bis zu dem Punkt, an dem Sie versuchen, die PDF zu öffnen zurückgegeben und Adobe Acrobat sagt Ihnen:Reporting Services als PDF über WebRequest in C# 3.5 "Nicht unterstützte Dateitypen"
Adobe Reader nicht ‚thisStoopidReport'.pdf‘ öffnen konnte, weil es ist entweder keine unterstützte Dateityp oder , weil die Datei beschädigt wurde (für Beispiel wurde es als E-Mail Anhang gesendet und wurde nicht korrekt decodiert).
Ich habe einige erste Fehlersuche zu diesem Thema gemacht. Wenn ich die URL im Aufruf von WebRequest.Create() durch eine gültige PDF-Datei auf meinem lokalen Rechner ersetze, zB: @ "C: temp/validpdf.pdf", dann erhalte ich ein gültiges PDF.
Der Bericht selbst scheint gut zu funktionieren. Wenn ich die URL manuell in den Reporting Services-Bericht eingabe, der die PDF-Datei generieren soll, werde ich zur Benutzerauthentifizierung aufgefordert. Aber nach der Lieferung bekomme ich eine gültige PDF-Datei.
Ich habe die tatsächlichen URL, Benutzername, Userpass und Domain-Strings im folgenden Code mit Scheinwerten aus offensichtlichen Gründen zu ersetzen.
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();
Wählen Sie diese Jungs! – JasonS
"zweite Reihe von Augen" wird auch "Gummiente debugging" genannt, Google es :) –