2008-12-10 4 views
5

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

Antwort

0

Könnte Ihr Problem, indem er erklärt Ihr Byte-Array zu einer Länge von 2048, anstatt die von GetResponseStream() zurückgegeben auf die Länge der Stromlänge stützen verursacht werden?

1

Sehen Sie sich die PDF-Datei an, die Sie in notepad.exe erhalten. Ich vermute, dass Sie dort HTML sehen werden. Wenn Sie eine Webseite aufrufen, die eine Pass-through-Seite ist, wird eine PDF-Datei angezeigt. Die Webanfrage erhält die HTML- und nicht die PDF-Datei zurück.

Wenn Sie eine Website aufrufen, die eine PDF-Datei direkt enthält, wie http://www.somesite.com/file.pdf wird Ihr Code funktionieren. Das Problem ist, dass Sie wahrscheinlich eine Pass-through-Webseite haben, die den wahren Speicherort der PDF-Datei verbirgt.

Die Art, wie ich das geschafft habe, war eine ISAPI-DLL zu erstellen, die es Ihnen erlaubte, die Parameter einzugeben, die benötigt werden, um zu bestimmen, welche PDF-Datei zurückgesendet werden muss. Dann würde die ISAPI DLL das PDF mit dem Inhaltstyp "application/pdf" zurücksenden.

1

Diejenigen von Ihnen, die das Problem vorgeschlagen haben, war HTML kommt von der URL zurück, wies mich in die richtige Richtung. Tatsächlich erkannte ich, dass der ursprüngliche Programmierer hier die PUT anstelle der GET-Methode verwendete.

So durch die einzige Zeile Korrektur:

request.Method = WebRequestMethods.Http.Post; 

Alles kommt jetzt Rosen up ... err pdf ... was auch immer es funktioniert.

Danke, dass Sie mich in die richtige Richtung weisen. Manchmal braucht es nur einen zweiten Blick.

+0

Wählen Sie diese Jungs! – JasonS

+0

"zweite Reihe von Augen" wird auch "Gummiente debugging" genannt, Google es :) –