【发布时间】:2012-04-20 20:21:05
【问题描述】:
我有一个允许从服务器下载文件的网络应用程序。文档可能是 Office 文件(.docx、pptx、.xslx)或 Pdf。
逻辑非常简单:在客户端单击时,将调用 Web 服务并调用传递所需参数的 aspx 页面 (Print.aspx)。打印页面调用 Web 服务来检索选定的文档二进制文件并将它们写入响应中:
protected void Page_Load(object sender, EventArgs e)
{
string fileName = Request.QueryString["fname"];
if (string.IsNullOrEmpty(documentID) == false)
{
byte[] document = GetPhysicalFile(documentID); //Get the binaries
showDownloadedDoc(document, fileName);
}
}
private void showDownloadedDoc(byte[] document, string fileName)
{
Response.Clear();
Response.ContentType = contentType;
Response.AppendHeader("content-disposition", string.Format("attachment; filename=\"{0}\"", fileName));
Response.BufferOutput = false;
Response.BinaryWrite(document);
Response.Close();
}
Pdf 文档在 Print.aspx 页面中打开,并且 aspx 页面仅加载一次。对于 Office 文件,Page_Load() 方法被调用 3 次。
第一次打开/保存文档对话框后,如果单击“打开”ic,则调用 Page_Load 两次,然后文档最终在 MS Word 中打开。
有没有一种方法可以防止在打开这些文档时加载多个页面?我想避免将文件保存在服务器端并重定向到该 URL,因为每次访问都会创建一个文件。
【问题讨论】:
-
您是否有理由不为此使用
GenericHandler?灰烬 -
我认为使用我的方法将是实现让用户下载文档需求的最简单方法(应用程序仅用于公司的内部网)。 GenericHandler 如何解决我当前的多页面加载问题?
-
使用 genericHandler 我不会拥有与 aspx 页面相同的 LifeCicle(+1,好主意)。
-
只是创建一个下载,您可能不需要asp Page LifeCycle,对吗? LifeCycle 用于生成 WebForms。上面的示例代码与 WebForms 无关,使用 GenericHandler 可能会快很多。此外,您将不再有 Page_Load 事件,因此不能多次调用它。这对我来说似乎很容易解决,但显然你没有使用 GenericHandler 是有充分理由的。
-
我添加了一个带有 GenericHandler 的示例。
标签: asp.net ms-office download