C# 通过C“3.5”中的WebRequest以PDF格式报告服务;“不支持的文件类型”;

C# 通过C“3.5”中的WebRequest以PDF格式报告服务;“不支持的文件类型”;,c#,pdf,reporting-services,C#,Pdf,Reporting Services,我继承了一个遗留应用程序,该应用程序应该可以从reporting services服务器获取动态pdf。直到您尝试打开返回的pdf文件,adobe acrobat告诉您: Adobe Reader无法打开 “thissoopidreport.pdf”,因为它是 不是受支持的文件类型,或者 因为文件已损坏(对于 例如,它是作为电子邮件发送的 附件和连接不正确 解码) 我已经对此做了一些初步的故障排除。如果我在本地计算机上用有效的pdf文件替换WebRequest.Create()调用中的url,即

我继承了一个遗留应用程序,该应用程序应该可以从reporting services服务器获取动态pdf。直到您尝试打开返回的pdf文件,adobe acrobat告诉您:

Adobe Reader无法打开 “thissoopidreport.pdf”,因为它是 不是受支持的文件类型,或者 因为文件已损坏(对于 例如,它是作为电子邮件发送的 附件和连接不正确 解码)

我已经对此做了一些初步的故障排除。如果我在本地计算机上用有效的pdf文件替换WebRequest.Create()调用中的url,即@“C:temp/validpdf.pdf”),那么我会得到一个有效的pdf文件

报告本身似乎运作良好。如果我手动键入reporting services报告的URL以生成pdf文件,系统会提示我进行用户身份验证。但在提供它之后,我得到了一个有效的pdf文件

出于显而易见的原因,我将下面代码中的实际url、用户名、userpass和域字符串替换为伪值

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

问题是否是由于将字节数组的长度声明为2048,而不是基于GetResponseStream()返回的流的长度造成的?

在notepad.exe中查看返回的pdf文件。我怀疑你会在那里看到HTML。如果你调用的网页是一个传递页面,它会切断一个pdf文件。web请求将返回HTML而不是PDF文件

如果你直接调用一个有pdf文件的网站,你的代码就可以了。问题是,您可能有一个传递网页,它隐藏了pdf文件的真实位置


我解决这个问题的方法是创建一个ISAPI DLL,它允许您传入确定需要返回哪些pdf文件所需的参数。ISAPI DLL将以“application/pdf”的内容类型流式返回pdf。

你们中的一些人认为问题在于从URL返回的HTML为我指明了正确的方向。事实上,就在那时,我意识到原来的程序员在这里使用了PUT而不是GET方法

因此,通过修正单线:

request.Method = WebRequestMethods.Http.Post;
现在一切都好起来了。。。错误pdf。。。不管它是什么

谢谢你给我指明了正确的方向。有时只需要第二组眼睛。

“第二组眼睛”也称为“橡皮鸭调试”,谷歌it:)