2009-12-08 47 views
4

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

它可以在我的开发机器上正常工作,当我将它部署到测试服务器时,它仍然可以在其中两个上工作;在其中一台服务器上(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>及其关闭标签。

我一直在挠我的头这一段时间了,有没有人有线索如何让这个工作?

+0

可以请你发布你已经提及的样品链接。 – Saar

回答

0

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

请注意Response.End()因为该方法终止线程并且在该点之后什么都不会执行。 您可能想要做一个Response.Flush()TransmitFile()以确保所有内容都发送到客户端。有关关于Response.End()的更多信息,请参阅this question

1

请勿使用Response.End();

尝试

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

,.NET 2.0之后,你应该使用

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

太糟糕了,不允许您发送二进制流。 – Nuzzolilo

0

显然有点晚要到OP是有用的,但显然ZIP文件有一些问题MIME类型和IIS压缩。见维基上SharpLibZip:

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

Response.ContentType = “应用程序/压缩” '如果浏览器接收一错位压缩文件,IIS压缩可能导致此问题。一些成员已发现 'Response.ContentType =‘应用/八位字节流’已经解决了这个。可能特定于Internet Explorer。

这也许就是为什么你需要使用的二进制/八位字节。