4 Stimmen

Reporting Services als PDF über WebRequest in C# 3.5 "Nicht unterstützter Dateityp"

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();

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X