c# - .NET 中的 PDF 二进制数据输出

标签 c# .net asp.net web-services pdf

我有一个关于输出 PDF 文件的问题。目前我以二进制形式将 PDF 存储在数据库中。我通过 URL 输出 PDF 文件,例如:

http://myhost.com/FileManager.aspx?FileId=8465b2f9-b64e-4a9a-a449-94b5adb3b278

因此,根据我的推断,对于浏览器来说,这是一个正在加载的 .aspx 页面,而不是 PDF。 Firefox 和 IE 可以正确解释这一点并启动 Adob​​e Acrobat,但是由于 Chrome (12.0.742.112) 有自己的 PDF 阅读器实现,因此它会正确打开文件,但当有人去 Chrome 中保存文件时,它想要将其另存为 .aspx。如果我只是将 .aspx 重命名为 .pdf,文件就会正确下载。然而,我试图避免告诉我的客户他/她可能必须采取额外的步骤。

当我选择通过 Web Inspector 查看 Chrome 中加载的 header 时,我看到了以下内容:

FileManager.aspx:-1 Resource interpreted as Document but transferred with MIME type application/pdf

我完全可以理解为什么 Chrome 会这么说。

此外,当我添加以下内容时,我会在页面加载时看到一个“另存为”框:

Response.AddHeader("content-disposition", "attachment;filename=blah.pdf");

但是,我希望将文件保留在浏览器中。那么,除了使用一些 URL 重写之外,有没有一种方法可以操作 HTTP header ,以简单地以 PDF 形式打开页面并在 Chrome 中正确保存?

最后,我尝试使用 WebService,但我似乎无法将二进制数据写入页面。

this.Context.Response.BinaryWrite(bytes);

感谢任何帮助!

最佳答案

在 Web 应用程序的顶级 web.config 中,添加以下内容 <add>元素到<httpHandlers>部分:

<httpHandlers>
    <add verb="*" path="FileManager.pdf" type="ProjectName.FileManager" />

...哪里ProjectName.FileManagerFileManager 的全名(命名空间和类名)类(class) FileManager.aspx.cs

这告诉 ASP.NET 处理路径 /FileManager.pdf使用 ProjectName.FileManager 定义的处理程序。 ( System.Web.UI.Page 实现 IHttpHandler 接口(interface),因此每个 Webform 都是一个处理程序。)

现在您可以通过带有 .pdf 扩展名的 URL 提供 PDF,如下所示:

http://myhost.com/FileManager.pdf?FileId=8465b2f9-b64e-4a9a-a449-94b5adb3b278

不需要需要重命名物理 FileManager.aspx文件。当用户在浏览器中输入/FileManager.pdf?FileId=foo 时,ASP.NET 将使用 FileManager.aspx 中定义的 ProjectName.FileManager 类来处理请求。

注意:

以上内容应该适用于Cassini(Visual Studio“迷你”网络服务器),无需进一步更改。但是,IIS 默认情况下仅向 ASP.NET 发送 *.aspx、*.asmx、*.ashx 请求。因此,要使上述内容在 IIS 上运行,您需要告诉它发送 /FileManager.pdf 的请求。到 ASP.NET。也就是说,你需要配置一个“映射”。

使用 IIS 6,您需要 configure the mapping using IIS manager .

使用 IIS 7,您可以 configure a mapping from your web.config --这使得部署更容易,但这取决于您的托管的设置方式。

关于c# - .NET 中的 PDF 二进制数据输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6672871/

相关文章:

c# - UDP 打洞帮助

c# - 使用 C# YouTube API 将视频上传到 YouTube 时出现 400 Bad Request Error

c# - 谷歌地图上的移动位置跟踪

c# - 将包含字母和数字的字符串转换为仅十进制数字

c# - 新的 StreamReader 类不接受文件名

c# - 无法在 visual studio 2012 中的 asp.net 中使用 sql server ce 4.0

.net - 在 C# Windows 运行时组件中,如何警告开发人员不要在公共(public)类中使用 ==?

c# - 为什么要验证 IP 地址?

c# - 数据绑定(bind)到父级可能为 null 的嵌套属性

asp.net - 不允许对其中一个域*进行集成 Windows 身份验证*