System.Text.Ecoding.UTF8.GetString返回垃圾

时间:2010-08-10 17:38:43

标签: asp.net encoding response.filter

这是一个艰难的。我有一个响应过滤器设置来转换html,然后再吐出到浏览器(http://aspnetresources.com/articles/HttpFilters)。这适用于每个机器,但我的机器。实际上它正在我的机器上工作,直到我不得不进行硬重置,因为它被锁定了。

public override void Write(byte[] buffer, int offset, int count)
{
    string strBuffer =  System.Text.UTF8Encoding.UTF8.GetString(buffer, offset, count);

对于其他人(以及我的先天),strBuffer包含HTML。无论出于何种原因,它都会为我返回垃圾字符。有任何想法吗?我把头发拉出来了!!

更新

原来“启用动态内容压缩”导致了这个问题。出于某种原因,它在被传递到过滤器之前被gzip压缩。

解决方案

在web.config中将“dynamicCompressionBeforeCache”设置为false修复了该问题。

<urlCompression doStaticCompression="true" doDynamicCompression="true" dynamicCompressionBeforeCache="false" />

2 个答案:

答案 0 :(得分:0)

听起来像是出了问题。锁定后我也有一些奇怪的行为。 对我有用的是删除C:\ Windows \ Microsoft.NET \ Framework \ v2.0.50727 \ Temporary ASP.NET Files

中的临时文件

答案 1 :(得分:0)

你已经指定了这些字节:31,139,8,0,0,0,0,0,4

这不是有效的UTF-8。特别是,它意味着Unicode字符U + 0031(“INFORMATION SEPARATOR ONE”)后跟字节139和8 ...而139后跟8不是有效的UTF-8字节序列。即使那些 形成一个有效的序列,你也会有5个Unicode U + 0000个字符(NUL),然后是U + 0004(END OF TRANSMISSION)。几乎没有有效的HTML。

我不知道你实际过滤了什么,但它不是有效的UTF-8文本。事实上,它看起来根本不是文本。您是否有可能尝试将过滤器应用于图像等二进制数据?

请注意,您的过滤方法存在另一个基本问题:您假设每个缓冲区都包含完整的文本。你很可能会收到一个缓冲区,其中包含一个字符的前半部分,然后是一个包含其余部分的第二个缓冲区。这就是System.Text.Decoder接口的用途 - 它是有状态的,记住部分字符。