我无法重现您描述的场景。我认为您的方法没有任何问题,这使我相信问题出在其他地方。请按照我采取的相同步骤来验证您的代码中没有其他任何内容被破坏,然后我们可以继续调试。
我使用 Visual Studio 生成了一个 UTF-16 编码的 xml 文件,然后使用 Total Commander 将其压缩到磁盘。
发送所需响应的快速而肮脏的方式是这样的(在你的 mvc 控制器中)
public ActionResult Index()
{
var path = Server.MapPath("~/Content/test.xml.gz");
var result = new FilePathResult(path, "text/xml");
Response.AddHeader("Content-Encoding", "gzip");
Response.Charset = "utf-16";
return result;
}
现在,虽然这会起作用,但它不是在 MVC 中的惯用方式,而且有点不受欢迎。正确的方法是实现您自己的操作结果,并让结果在执行时设置适当的标头。使用这种方法可以在“干净”的 http 上下文中对结果进行后处理。
所以,这里有一个这样的动作结果的例子。
public class BinaryFileResult : FilePathResult
{
public string Charset { get; set; }
public string ContentEncoding { get; set; }
public BinaryFileResult(string fileName, string contentType) : base(fileName, contentType) { }
protected override void WriteFile(HttpResponseBase response)
{
if (this.Charset != null)
response.Charset = this.Charset;
if (this.ContentEncoding != null)
response.AppendHeader("Content-Encoding", this.ContentEncoding);
base.WriteFile(response);
}
}
有了这是我们的工具带,我们可以将操作方法简化为这样的东西
public ActionResult Index()
{
return new BinaryFileResult(Server.MapPath("~/Content/test.xml.gz"), "text/xml")
{
Charset = "utf-16",
ContentEncoding = "gzip"
};
}
使用这两种方法,我可以在 IE9 中查看正确解码的 xml 文件。试一试,让我知道它是否有效。
更新
这是我用来测试它的文件。正如我所说,它们在我的机器上的 IE9 上产生了适当的结果。