4

我正在开发一个 ASP.NET 应用程序,它在某一时刻使用 Response.TransmitFile 向用户发送一个文件。

它在我的开发机器上运行良好,当我将它部署到测试服务器时,它仍然可以在其中两个上运行;虽然在其中一台服务器(W2K3)中它只适用于 Firefox,但当我在 IE7 上尝试它时,我收到一个错误,如“Internet Explorer 无法在(服务器名称)上打开文件 sendfile.aspx”。

我创建了一个小的内联 aspx 页面来重现问题,这里是:

<%@ Page Language="C#" %>
<html><head>
<script language="CS" runat="server">
    void Page_Load(object sender, System.EventArgs e) 
    {
        string filePath = @"C:\temp\export.zip";
        Response.ClearHeaders();
        Response.ContentType = "application/zip";
        Response.Clear();
        Response.AppendHeader("Content-disposition", "attachment; filename=export.zip");
        Response.TransmitFile(filePath);
        Response.End();
    }
</script>
</head></html>

我尝试了不同的东西,我注意到如果我注释掉该Response.End行它会再次起作用(但是根据我在网上找到的每个示例代码,AFAIK 这行应该在那里)

<html>, <head>我注意到的另一个可能相关也可能不相关的问题是,如果我删除 the及其结束标签,它也会失败。

我已经为此苦苦思索了一段时间,有人知道如何让它工作吗?

4

3 回答 3

1

不要使用 Response.End();

尝试

Response.TransmitFile(filePath);
Response.End();

事实上,在.NET 2.0之后,你应该使用

Response.TransmitFile(filePath);
context.HttpApplication.CompleteRequest();
于 2012-06-28T16:07:33.053 回答
0

显然对 OP 有用有点晚了,但显然 ZIP 文件在 MIME 类型和 IIS 压缩方面存在一些问题。请参阅 SharpLibZip 上的 wiki:

https://github.com/icsharpcode/SharpZipLib/wiki/Zip-Samples#wiki-anchorMemory

Response.ContentType = "application/zip" ' 如果浏览器接收到损坏的 zip 文件,则 IIS 压缩可能会导致此问题。一些成员发现 ' Response.ContentType = "application/octet-stream" 解决了这个问题。可能特定于 Internet Explorer。

这可能解释了为什么您需要使用二进制/八位字节。

于 2013-02-08T16:23:35.300 回答
0

由于我(还)不能添加评论,这里有一个小注释。

请注意Response.End()因为该方法会终止线程,并且在那之后不会执行任何操作。您可能希望在TransmitFile( )之后执行Response.Flush( )以确保所有内容都发送到客户端。

有关 Response.End() 的更多信息,请参阅此问题

于 2011-04-14T15:47:06.400 回答