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

时间:2008-12-10 17:18:59

标签: c# pdf reporting-services

我继承了一个遗留应用程序,该应用程序应该从报告服务服务器中获取动态pdf。一切正常,直到您尝试打开返回的PDF格式,adobe acrobat告诉您:

  

Adob​​e Reader无法打开   'thisStoopidReport'.pdf'因为它是   要么不是支持的文件类型,要么是   因为文件已被损坏(for   例如,它是作为电子邮件发送的   附件并没有正确   解码)。

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

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

由于显而易见的原因,我将伪代码替换为下面代码中的实际url,username,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();

3 个答案:

答案 0 :(得分:1)

那些提出问题的人是从URL返回的HTML指向我正确的方向。事实上,当我意识到这里的原始程序员使用PUT而不是GET方法时。

所以通过纠正单行:

request.Method = WebRequestMethods.Http.Post;

现在一切都出现了玫瑰......错误的pdf ......无论它是什么。

感谢您指点我正确的方向。有时它只需要第二组眼睛。

答案 1 :(得分:1)

查看您在notepad.exe中找到的pdf文件。我怀疑你会在那里看到HTML。如果您调用的是通过页面的网页,则会切断pdf文件。 Web请求将返回HTML而不是PDF文件。

如果您直接呼叫具有pdf文件的网站,例如http://www.somesite.com/file.pdf您的代码将起作用。问题是你可能有一个隐藏pdf文件真实位置的网页传递。

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

答案 2 :(得分:0)

您的问题可能是由于将字节数组声明为2048而不是基于GetResponseStream()返回的流的长度而导致的吗?