1

我有许多文件保存到光盘并使用 gzip 压缩,因为它们最终将显示在浏览器中。我使用 ASP.NET MVC 并在代码中添加以下标头

Response.AppendHeader("Content-Encoding", "gzip");

我得到以下响应标头

Cache-Control:private
Connection:Close
Content-Encoding:gzip
Content-Length:791
Content-Type:text/xml

几乎可以正常工作。这些文件是带有 UTF-16 XML 声明的 XML 文件。

<?xml version="1.0" encoding="utf-16"?>

为了让它在 IE 中正确显示,我还需要将响应编码为 UTF-16。在不破坏 gzip 解压缩等的情况下,我需要在响应中进行哪些更改才能使其正常工作?

更新#1

还尝试添加字符集标头以返回以下响应标头

Cache-Control:private
Connection:Close
Content-Encoding:gzip
Content-Length:791
Content-Type:text/xml; charset=UTF-16

然而,这会破坏 gzip 压缩,结果是未压缩的 gzip 内容......

4

1 回答 1

1

我无法重现您描述的场景。我认为您的方法没有任何问题,这使我相信问题出在其他地方。请按照我采取的相同步骤来验证您的代码中没有其他任何内容被破坏,然后我们可以继续调试。

我使用 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 上产生了适当的结果。

于 2012-04-10T15:49:15.493 回答