ASP.NET Response.Filter

Sta*_*lli 3 asp.net filter response.filter

我需要创建<h2>将HTML中的标签替换为的过滤器<h3>

我的过滤器

public class TagsFilter:Stream
{
    HttpContext qwe;

    public TagsFilter(HttpContext myContext)
    {
        qwe = myContext;
    }

    public override void Write(byte[] buffer, int offset, int count)
    {
        string html = System.Text.Encoding.UTF8.GetString(buffer);
        html = html.Replace("<h2>", "<h3>");
        qwe.Response.Write(html.ToCharArray(), 0, html.ToCharArray().Length);
    }
Run Code Online (Sandbox Code Playgroud)

我的模块

public class TagsChanger : IHttpModule
{
    public void Init(HttpApplication context)
    {
        context.Response.Filter = new TagsFilter(context.Context);
    }
Run Code Online (Sandbox Code Playgroud)

我收到错误System.Web.HttpException:在这种情况下,答案不可用。

Evg*_*kov 6

请看Rick Strahl的帖子“使用Response.Filter捕获和转换ASP.NET输出”

Response.Filter内容已分块。因此,要有效地实现Response.Filter,只需要实现一个自定义流并处理Write()方法即可捕获编写的Response输出。乍一看,这看起来非常简单-您可以在Write中捕获输出,对其进行转换,然后一次性写入转换后的内容。这确实适用于少量内容。但是您看到的问题是,输出是用小的缓冲区块(看起来少于16k)写的,而不是仅将单个Write()语句写入流中,这对于ASP.NET将数据流传输到IIS中的块较小,以最大程度地减少途中的内存使用。

不幸的是,这也使实施任何过滤例程变得更加困难,因为您无法直接访问所有响应内容,这是有问题的,尤其是如果那些过滤例程需要您查看整个响应以转换或捕获解决方案所需的输出,是我会话中的绅士所要求的。

因此,为了解决此问题,需要一种略有不同的方法,该方法基本上捕获传递到缓存流中的所有Write()缓冲区,然后仅在流完成并准备好进行刷新时才使该流可用。

在考虑实现时,我也开始考虑使用Response.Filter实现时的几个实例。每次我必须创建一个新的Stream子类并创建我的自定义功能时,最后每个实现都做同样的事情-捕获输出并对其进行转换。我认为应该通过创建可重用的Stream类来实现此目的的更简单方法,该类可以处理Response.Filter实现中常见的流转换。

Rick Strahl编写了自己的流过滤器实现,该实现允许以正确的方式替换文本。