0

这是困难的一个。我有一个响应过滤器设置来转换 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。现在无论出于何种原因,它都会为我返回垃圾字符。有任何想法吗?我要拔头发了!!

更新

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

解决方案

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

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

2 回答 2

0

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

于 2010-08-10T18:11:17.153 回答
0

您已经指定了这些字节:31、139、8、0、0、0、0、0、4

这不是有效的 UTF-8。特别是,这将意味着 Unicode 字符 U+0031(“信息分隔符 ONE”)后跟字节 139 和 8...,而 139 后跟 8 不是有效的UTF-8字节序列。即使它们确实形成了一个有效的序列,你也会有 5 个 Unicode U+0000 字符 (NUL),然后是 U+0004(传输结束)。几乎没有有效的 HTML。

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

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

于 2010-08-10T18:11:23.580 回答