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();
votez ces gars! – JasonS
"deuxième ensemble d'yeux" est également appelé "débogage de canard en caoutchouc", google :) –