Response.TransmitFile,Response.End和IE的问题

时间:2009-12-08 19:59:27

标签: asp.net response.transmitfile

我正在开发一个ASP.NET应用程序,它一次使用Response.TransmitFile将文件发送给用户。

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

我已经创建了一个小的内联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这行应该在那里,至少根据我在网上找到的每个示例代码)< / p>

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

我一直在摸不着头脑,有没有人知道如何让它发挥作用?

3 个答案:

答案 0 :(得分:1)

不要使用Response.End();

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

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

Response.TransmitFile(filePath);
context.HttpApplication.CompleteRequest();

答案 1 :(得分:0)

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

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

有关Response.End()的详细信息,请参阅this question

答案 2 :(得分: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特有的。

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