1

WCF (asp.net アプリケーションではない) で動作する単純な html および javascript クライアント アプリケーションがあります。静的ページでいくつかの変数を変更する必要があるため、Response.Filter が最適なオプションであると判断しました。数行のコードを書いて動作しましたが、ブラウザを何度か更新した後、間違いがあることに気付きました。ページのエンコーディングが壊れています。私は何を間違っていますか?

Global.asax: (他のイベントも試しましたが、何も変わりません)

private void Application_PostReleaseRequestState(object sender, System.EventArgs e)
{
    if (Request.CurrentExecutionFilePathExtension.EndsWith(".html") || Request.CurrentExecutionFilePathExtension.EndsWith(".js"))
    {
        Response.Filter = new ContentFilter(Response.Filter);
    }
}

ContentFilter.cs

public class ContentFilter : MemoryStream
{
    private Stream outputStream = null;

    private Regex version = new Regex("%version%", RegexOptions.Compiled | RegexOptions.Multiline);


    public ContentFilter(Stream output)
    {
        outputStream = output;
    }


    public override void Write(byte[] buffer, int offset, int count)
    {
        // Convert the content in buffer to a string
        string contentInBuffer = UTF8Encoding.UTF8.GetString(buffer);

        contentInBuffer = version.Replace(contentInBuffer, "2");

        outputStream.Write(UTF8Encoding.UTF8.GetBytes(contentInBuffer), offset, UTF8Encoding.UTF8.GetByteCount(contentInBuffer));
    }
}

丁目失敗

注: Windows 8 で IIS 7.5 を使用しています。

contentInBuffer 変数の値として Write メソッドで ContentFilter.cs をデバッグしているときにこれらを見ました。IIS 設定でデフォルトで GZIP 圧縮を使用しているのかもしれません。

`�\b\0\0\0\0\0\0�Z�n�����w3\b(�\"�VD�I���8A۵��a���r��� ��,m�\t��>@�����t�\n(P�/��+��]���$���B�3s�|���_�n� ...

4

2 に答える 2

1

実装に渡されるoffsetandを無視しています。インデックスとカウントも取るオーバーライドを使用すると役立つ場合があります。countWriteGetString

ただし、他にもいくつかの問題があるのではないかと心配しています。関数で受け取るデータWriteはチャンクで到着します。最初のチャンクが「%vers」で終わり、2 番目のチャンクが「ion%」で始まる場合はどうなりますか?

また、非 ASCII 文字は UTF-8 では複数のバイトとして表されるため、単一の Unicode 文字が への後続の 2 つの呼び出しに「分散」する可能性があり、失敗のWrite原因となります。UTF8Encoding.UTF8.GetString

于 2012-11-12T12:58:21.267 に答える
1

私もこの問題に遭遇しました。これは、IIS の静的コンテンツの GZip 圧縮が原因でした。破損に対抗するために、次の Web.Config エントリで静的圧縮を無効にしました。

<system.webServer>
  <urlCompression doStaticCompression="false" />
</system.webServer>

また、2700 バイトより小さいファイルは既定では圧縮されないことがわかります (IIS 圧縮設定を参照)。これは、それより大きい静的コンテンツでのみ表示されます。

お役に立てれば。

于 2012-12-12T20:59:40.823 に答える