2012-11-12 35 views
1

我有一个简单的HTML和JavaScript客户端应用程序与WCF(而不是一个asp.net应用程序)一起工作。我需要在静态页面中更改一些变量,因此我认为Response.Filter对我来说是最合适的选择。我写了几行代码,它工作正常,但是在浏览器刷新几次之后,我发现有一个错误。有东西破坏了页面的编码。我究竟做错了什么?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上使用IIS 7.5 8.

我看到这些,而我在调试ContentFilter.cs写我作为contentInBuffer变量的值。默认情况下,我在IIS设置中使用GZIP压缩,这可能就是这样。

`\ B \ 0 \ 0 \ 0 \ 0 \ 0 \ 0Znw3 \ B(\“VDI8A5a R,M \ T> @t \ N(P/+] $B3s| _n ...

+0

您是否检查了Fiddler中的响应内容?我已经看到了与Response.Filter相关的几个问题,但它们大多与错误地更新内容有关。我首先要验证标题和内容字节。你在回复中使用国际角色吗? – 2012-11-12 04:44:42

+0

是的,有土耳其的字符,如ö,ç,ü,ş和»。我会用提琴检查它。我不明白为什么,但第一次打开页面,3次刷新后就开始失败。 – iboware

+0

这是我的提琴手的输出。 :) – iboware

回答

1

你忽略传递给你Write实施offsetcount,它可能有助于使用GetString覆盖还需要一个索引和计数。

然而,恐怕还有其他一些问题,你在Write函数中收到的数据将会以大块的形式出现,如果第一个块以“%vers”结尾,第二个以“离子%”开始?

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

+0

我试图禁用IIS压缩,现在它运作良好,但它不是一个解决方案。你是正确的抵消和计数。我只是想先让它工作。 我需要这个,因为缓存的JavaScript和CSS文件导致一些问题。由于我的客户端应用程序不是ASP.NET应用程序,因此我需要使用户的浏览器缓存无效。你有什么更好的主意来实现这一目标? – iboware

+0

@Amount是正确的 - 由于响应中的非ASCII字符,您必须对数据进行缓冲,然后才能对其进行更改。 – 2012-11-12 21:11:06

1

我也遇到过这个问题,这是由于GZip压缩静态内容在IIS中造成的。为了打击腐败,通过以下Web.Config进入我禁用静态压缩:

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

,同时开启了超过2700个字节的文件较小默认情况下不压缩(请参阅IIS压缩设置),所以你只有会看到这个比静态内容更大。

希望这会有所帮助。