2008-12-10 10 views
5

J'ai hérité d'une application héritée supposée récupérer un pdf à la volée à partir d'un serveur de services de reporting. Tout fonctionne bien jusqu'au moment où vous essayez d'ouvrir le pdf d'être renvoyé et adobe acrobat vous dit:Reporting Services en PDF via WebRequest en C# 3.5 "Type de fichier non pris en charge"

Adobe Reader ne pouvait pas ouvrir « thisStoopidReport'.pdf » parce qu'il est soit pas un type de fichier pris en charge ou parce que le fichier a été endommagé (pour par exemple, il a été envoyé en tant que pièce jointe de courrier électronique et n'était pas correctement décodé).

J'ai déjà effectué un dépannage initial à ce sujet. Si je remplace l'URL de l'appel WebRequest.Create() par un fichier pdf valide sur ma machine locale, c'est-à-dire: @ "C: temp/validpdf.pdf"), je reçois un PDF valide.

Le rapport lui-même semble fonctionner correctement. Si je tape manuellement l'URL dans le rapport des services de rapports qui doit générer le fichier pdf, je suis invité à l'authentification de l'utilisateur. Mais après l'avoir fourni, je reçois un fichier pdf valide.

J'ai remplacé l'URL, le nom d'utilisateur, le userpass et les chaînes de domaine dans le code ci-dessous avec des valeurs fausses pour des raisons évidentes.

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

Répondre

0

votre problème pourrait être causé en déclarant votre tableau d'octets à une longueur de 2048 plutôt que de baser la longueur sur la longueur du flux retourné par GetResponseStream()?

1

Affichez le fichier pdf que vous récupérez dans notepad.exe. Je soupçonne que vous verrez du HTML là-dedans. Si vous appelez une page Web qui est une page de passage, cela coupe un fichier pdf. La requête Web récupérera le code HTML et non le fichier PDF.

Si vous appelez un site Web qui a un fichier pdf directement, comme http://www.somesite.com/file.pdf votre code fonctionnera. Le problème est que vous avez probablement un passage à travers la page Web qui cache l'emplacement réel du fichier pdf. La façon dont j'ai pu contourner ce problème consistait à créer une DLL ISAPI qui vous permettait de transmettre les paramètres dont elle avait besoin pour déterminer quel fichier pdf devait être renvoyé. Que la DLL ISAPI retransmettrait le pdf avec un type de contenu "application/pdf".

1

Ceux d'entre vous qui ont suggéré que le problème était le HTML qui revenait de l'URL m'a indiqué dans la bonne direction. En fait, c'est à ce moment-là que j'ai réalisé que le programmeur original utilisé ici utilisait la méthode PUT au lieu de la méthode GET.

Donc, en corrigeant la seule ligne:

request.Method = WebRequestMethods.Http.Post; 

Tout est maintenant à venir roses ... err pdf ... tout cela fonctionne.

Merci de m'avoir indiqué la bonne direction. Parfois, il suffit d'un deuxième ensemble d'yeux.

+0

votez ces gars! – JasonS

+0

"deuxième ensemble d'yeux" est également appelé "débogage de canard en caoutchouc", google :) –