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

また、以下の応答ヘッダーを返すためにcharsetヘッダーを追加しようとしました

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 を使用してディスクに gzip しました。

必要な応答を送信する簡単な方法は、次のようになります (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"
    };
}

これらの方法の両方を使用して、適切にデコードされた xml ファイルを IE9 で見ることができます。試してみて、うまくいくかどうか教えてください。

更新 テストに使用したファイルは次のとおりです。私が言ったように、私のマシンのIE9で適切な結果が得られます。

于 2012-04-10T15:49:15.493 に答える