Response.Filter随机中断编码

时间:2012-11-12 04:20:12

标签: c# .net iis filtering httpresponse

我有一个简单的html和javascript客户端应用程序与WCF(不是asp.net应用程序)一起工作。我需要更改静态页面中的一些变量,所以我认为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));
    }
}

chome failure

注意:我在Windows 8上使用IIS 7.5。

当我在Write方法中调试ContentFilter.cs作为contentInBuffer变量的值时,我看到了这些。我在IIS设置中默认使用GZIP压缩,也许就是这个。

`\ B \ 0 \ 0 \ 0 \ 0 \ 0 \ 0Znw3 \ B(\“VDI8A5ar ,米\ T> @t \ N(P / +] $B3s| _ n ...

2 个答案:

答案 0 :(得分:1)

您忽略了传递给offset实施的countWrite。使用GetString覆盖也可能有帮助,该覆盖也需要索引和计数。

但是,我担心还有其他一些问题。您在Write函数中收到的数据将以块的形式到达。如果第一个块以“%vers”结束而第二个块以“ion%”开头会发生什么?

此外,由于非ASCII字符在UTF-8中表示为多个字节,因此单个Unicode字符可能会“分散”两次后续调用Write,这将导致UTF8Encoding.UTF8.GetString失败

答案 1 :(得分:1)

我也遇到过这个问题,这是由于IIS中静态内容的GZip压缩造成的。为了防止损坏,我通过以下Web.Config条目禁用了静态压缩:

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

事实证明,默认情况下不会压缩小于2700字节的文件(请参阅IIS压缩设置),因此您只会看到静态内容大于此值的文件。

希望这有帮助。