我有一个简单的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));
}
}
注意:我在Windows 8上使用IIS 7.5。
当我在Write方法中调试ContentFilter.cs作为contentInBuffer变量的值时,我看到了这些。我在IIS设置中默认使用GZIP压缩,也许就是这个。
`\ B \ 0 \ 0 \ 0 \ 0 \ 0 \ 0Znw3 \ B(\“VDI8A5ar ,米\ T> @t \ N(P / +] $B3s| _ n ...
答案 0 :(得分:1)
您忽略了传递给offset
实施的count
和Write
。使用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压缩设置),因此您只会看到静态内容大于此值的文件。
希望这有帮助。