C# Response.Write pdf 不适用于 Android 浏览器

Posted

技术标签:

【中文标题】C# Response.Write pdf 不适用于 Android 浏览器【英文标题】:C# Response.Write pdf not working with Android Browser 【发布时间】:2011-09-29 19:49:50 【问题描述】:

我目前在使用 pdf 导出的 android 环境方面遇到了很大的问题。我正在使用报表查看器控件将报表呈现为字节数组。接下来我使用 response.binarywrite 方法将字节流输出到浏览器。这适用于每个浏览器以及 iphone 和 ipad。但是,它不适用于android。

PDF 说它已损坏。当我在记事本中打开 pdf 时,我看到它正在导出我的整个页面 html,而不是报表查看器生成的字节数组。

代码:

    Warning[] warnings;
    string[] streamids;
    string mimeType;
    string encoding;
    string extension;
    string filename = "attachment; filename=Data.pdf";

    byte[] bytes = ReportViewer1.ServerReport.Render(
       "PDF", null, out mimeType, out encoding,
        out extension,
       out streamids, out warnings);

    Response.Buffer = true;
    Response.Clear();
    Response.ContentType = "application/pdf";
    Response.AddHeader("content-disposition", filename);
    Response.BinaryWrite(bytes);
    Response.Flush();
    Response.End();

【问题讨论】:

@Yuliy - 因为它适用于除 Android 之外的所有平台。 这对我在 chrome 中也不起作用,我认为这与内置查看器有关。 我的页面在 chrome 上运行良好,它是唯一的 android。看起来问题是它正在导出我的页面 html 而不是报表查看器返回给我的字节数组,我不知道为什么。 此代码是否在包含 html 的页面中?还是从带有html的页面调用的代码? 代码是从带有 html 的页面调用的,因为用户有下拉菜单和复选框,他们可以更改他们想要生成的数据。 【参考方案1】:

您需要从页面中删除所有 HTML(设计时)。

【讨论】:

这不是 Response.Clear();吗??【参考方案2】:

根据公开的Android issue 11422,content-disposition 的处理不符合 RFC。尝试引用文件名值 (filename="Data.pdf") 并查看它是否正确保存。

此外,*** answer 建议在内容类型之外设置 MIME 类型。

【讨论】:

感谢您的帮助。我尝试了所有建议都无济于事。它看起来仍然像导出页面 html 而不是我从报告查看器创建的字节数组,即使我专门从查看器导出字节数组【参考方案3】:

如果在这段代码之前有任何 HTML,那么它将被发送到浏览器,因为Response.Clear() 只清除缓冲的 HTML 输出,而Response.Buffer 仅在没有输出 HTML 时才有效。

尝试在代码之前阻止任何输出(以某种方式)或将此代码移动到其自己的文件中。然后去掉输出缓冲代码。

PS:这可能有效,也可能无效;我还没有机会测试它。 Android 的内容配置也存在很多问题,因此您可能需要按照 GalacticCowboy 的建议设置 MIME 类型。

【讨论】:

我在第一页上生成了字节数组,将其存储在会话中,重定向到一个没有 html 的新页面,该页面从会话中抓取数组并将 response.writes 发送给用户。现在我的pdf是空的。我知道如何将内容类型设置为 application/pdf 但如何设置 mime 类型? @mscard02 - 如果 pdf 为空,则要么第一页上的代码失败(可能将会话设置为空),要么会话因某种原因消失。您可以在代码中设置断点并找出字节数组的去向吗?另外,我认为mime类型和content type是一回事,所以我不确定他在说什么…… 我在即将通过响应发送之前在字节数组上放置了一个断点,它几乎是 8mb,但是当我点击将 pdf 保存在 android 上时,文件大约是 120kb。

以上是关于C# Response.Write pdf 不适用于 Android 浏览器的主要内容,如果未能解决你的问题,请参考以下文章

ASP.NET - 停止/解决方法 Response.Write() 的异步行为

从 C# 在新选项卡中打开页面

使用 Response.Write JSON 输出从 Jquery 调用 c# asmx Web 服务

C#中Console.WriteLine与Response.Write有啥区别

为啥在C#中用Response.Write("<script>alert('内容')</script>")时,当弹出提示框是,网页其

C# .NET弹出窗口大全