5

我正在生成一个按钮事件的文件。我必须遵循代码:

Response.ClearHeaders();
Response.ClearContent();
Response.Buffer = false;
Response.ContentType = "application/octet-stream";
Response.AppendHeader("Content-Disposition", "attachment; filename=Duck.xml");
Response.Write("First part");
Response.Flush();

//simulate long operation   
System.Threading.Thread.Sleep(10000);

//Done
Response.Write("Done");
Response.Flush();
Response.End();

我希望在第一次刷新后出现“另存为”对话框,因为该操作可能需要一段时间。我该怎么办?

经过一番玩耍后,我发现它会缓冲 256 个字符(可以通过向客户端发送新字符串('x',256)来重现)。

4

2 回答 2

2

我猜您正在使用 Internet Explorer,因为它明确说明它将在 MIME 类型检测期间使用 256 字节缓冲区:

根据文档: http: //msdn.microsoft.com/en-us/library/ms775147 (v=vs.85).aspx

如果 MIME 类型是“text/plain”、“application/octet-stream”、空字符串或 null,则它是不明确的

...

FindMimeFromData 在调用时通常会接收三个参数——缓存文件名(假定从关联的 URL 派生)、指向包含最多前 256 个字节内容的缓冲区的指针,以及通常对应于的“建议的”MIME 类型服务器提供的 MIME 类型(通过 content-type 标头)。

如果没有发送前 256 个字节来填充缓冲区,它甚至无法开始确定 MIME 类型。确定 MIME 类型后,它与 Windows 注册表 CLSID 相关联,并决定应为流显示哪种 UI,从而创建“另存为”对话框。

正如评论中所说,最广泛使用的解决方案似乎是用任何字符的 256 个出现来填充响应,如: http ://encosia.com/easy-incremental-status-updates-for-long-requests/

// Padding to circumvent IE's buffer*
Response.Write(new string('*', 256));  
Response.Flush();

我还记得在 IE 友好的错误页面上阅读过类似的内容,这些错误页面可能会受到相同行为的影响,请参阅http://blogs.msdn.com/b/ieinternals/archive/2010/08/19/http-error-pages -in-internet-explorer.aspx

编辑 :

根据@Ben 的评论,在您的情况下,使用 IE 明确的内容类型,将您设置为“text/xml”或“application/xml”应该可以解决您的问题。

请参阅我应该为我的 XML 站点地图发送什么 Content-Type 值?对于差异。

于 2012-10-05T11:16:57.703 回答
-1

恐怕没有办法做到这一点。End()只有在调用方法时才会发回响应。

于 2012-10-04T10:58:08.210 回答