c# – ASP.NET MVC无法传输文件

我有一个ASP.NET MVC 4站点,使用OPEN
XML SDK创建一个excel文件.我只是将超链接指向适当的控制器,它生成OPEN XML excel文档并将流写入响应头并完成.在IE 9和Chrome中,这很好用.使用给定的文件名和正确的内容下载文件.然而,就在最近我将浏览器升级到IE 10,而不是下载文件并在excel中打开我得到的错误无法打开’URI’.当我单击确定它会出现另一个错误:Microsoft Excel无法访问文件’URI’.有几个可能的原因:

我不明白为什么这可以在IE 9和Chrome中工作,而不是在IE 10中.我使用小提琴程序调试了响应头,它具有正确的内容类型和内容长度设置:

内容类型:application / vnd.openxmlformats-officedocument.spreadsheetml.sheet

内容处理:附件;文件名= result.xlsx

内容长度:1232

有什么东西我错过了吗?

代码片段:这一切都是其中的一部分

public override void ExecuteResult(ControllerContext context)
{
...
....
..
    extention = "xlsx";
    response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
    response.AddHeader("Content-Disposition",
                                    String.Format("attachment; filename={0}.{1}", fileName, extention));
    response.AddHeader("Content-Length", mem.Length.ToString());
    mem.Seek(0, SeekOrigin.Begin); // Go back to the begining.
    mem.CopyTo(response.OutputStream);
    context.HttpContext.ApplicationInstance.CompleteRequest();
}

最佳答案 作为一种解决方法,
Controller.File适用于ASP.NET MVC 4和IE 10:

public class DownloadController : Controller
{
    public ActionResult GetFile()
    {
        ...

        mem.Position = 0;

        return File(
            mem, 
            "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", 
            "result.xlsx");
    }
}

编辑

所以我一直在CodePlex上浏览MVC源代码,发现了一些与你的代码片段不同的实现细节:

>从不设置Content-Length标头
>而不是调用Stream.CopyTo,他们使用一个简单的Stream.Read,Stream.Write循环,缓冲区大小为0x1000
>设置Content-Disposition标头时,它们会检查文件下载名称是否包含UTF-8字符,如果是,则根据RFC 2231对其进行编码.请参阅ContentDispositionUtil.GetHeaderValue
>从不调用context.HttpContext.ApplicationInstance.CompleteRequest()

现在,您可以尝试逐个应用这些更改,并查看哪一个使其适用于IE 10.

点赞