生产vs开发服务器内容 - 处置文件名编码

时间:2012-10-18 12:54:56

标签: asp.net-mvc-3 google-chrome content-disposition

我正在使用asp.net mvc3,在同一浏览器(Chrome 22)中下载文件。这是控制器代码:

[HttpPost]
public ActionResult Uploadfile(HttpPostedFileBase file)//HttpPostedFileBase file, string excelSumInfoId)
{
    ...
    return File(
        result.Output,
        "application/vnd.ms-excel",
        String.Format("{0}_{1:yyyy.MM.dd-HH.mm.ss}.xls", "Суммирование", DateTime.Now));
}

在我的开发机器上,我下载了一个程序化创建的文件,其名称为“Суммирование_2012.10.18-13.36.06.xls”。

响应:

Content-Disposition:attachment; filename*=UTF-8''%D0%A1%D1%83%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_2012.10.18-13.36.06.xls
Content-Length:203776
Content-Type:application/vnd.ms-excel
Date:Thu, 18 Oct 2012 09:36:06 GMT
Server:ASP.NET Development Server/10.0.0.0
X-AspNet-Version:4.0.30319
X-AspNetMvc-Version:3.0

从生产服务器我下载一个文件,其名称为控制器的动作+正确的扩展名“Uploadfile.xls”,这是错误的。

响应:

Content-Disposition:attachment; filename="=?utf-8?B?0KHRg9C80LzQuNGA0L7QstCw0L3QuNC1XzIwMTIuMTAuMTgtMTMuMzYu?=%0d%0a =?utf-8?B?NTUueGxz?="
Content-Length:203776
Content-Type:application/vnd.ms-excel
Date:Thu, 18 Oct 2012 09:36:55 GMT
Server:Microsoft-IIS/7.5
X-AspNet-Version:4.0.30319
X-AspNetMvc-Version:3.0
X-Powered-By:ASP.NET

两台机器上的Web.config文件都是相同的。

为什么同一浏览器的文件名编码方式不同? web.config中是否有任何类型的默认设置在我缺少的机器上有所不同?

2 个答案:

答案 0 :(得分:3)

开发服务器运行的是.NET 4,生产服务器运行的是.NET 4.5。 MVC框架包含一个启发式方法,用于确定是否需要将RFC 6266用于Content-Disposition标头,并且虽然此启发式在.NET 4上正常工作,但它在.NET 4.5上无法正常工作。最终结果是Content-Disposition标头被破坏了,就像你在这个例子中看到的一样。

您最简单的操作可能是将应用程序升级到MVC 4.该版本的框架包含一个更强大的不同启发式,并且应该在.NET 4和.NET 4.5上都能正常工作。

答案 1 :(得分:0)

最可能的原因似乎是服务器确实看到了不同的User-Agent标头字段。

话虽如此,第二个响应对于任何浏览器都不正确,您应该向Microsoft报告该问题。