我正在开发一个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>
及其结束标记,它也会失败。
我一直在摸不着头脑,有没有人知道如何让它发挥作用?
答案 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特有的。
这可能解释了为什么需要使用二进制/八位字节。