代码之家  ›  专栏  ›  技术社区  ›  NightOwl888 Jabrwoky

在ASP.NET2.0如何从呈现的页面/控件输出中删除额外的制表符和换行符?

  •  2
  • NightOwl888 Jabrwoky  · 技术社区  · 14 年前

    Here is an example .

    嗯,我试过了,而且很管用……但是。。。。

    即使我只能用这个方法删除50%的空白,它仍然会为正则表达式留下更少的工作——这意味着它应该比单独使用正则表达式表现得更好。

    1. 将换行符属性设置为空字符串
    2. 重写Indent属性并返回0

    我还尝试重写RenderChildren、Render、BeginRender和EndRender以传入我的自定义HtmlTextWriter,但我似乎无法使一个简单的label控件在其标记之前移除选项卡。我还使用Reflector深入研究了这个框架,但我根本不知道这些角色是如何生成的——我以为我使用的是“一网打尽”的方法,但显然我遗漏了一些东西。

    不管怎样,这是我想到的。这个代码没有按我希望的方式运行。当然,我也尝试过直接重写页面上的各种呈现方法,并传入一个自定义HtmlTextWriter的实例,但也没有成功。

    Public Class PageCompressorControlAdapter
        Inherits System.Web.UI.Adapters.ControlAdapter
    
        Protected Overrides Sub RenderChildren(ByVal writer As System.Web.UI.HtmlTextWriter)
            MyBase.RenderChildren(New CompressedHtmlTextWriter(writer))
        End Sub
    
        Protected Overrides Sub Render(ByVal writer As System.Web.UI.HtmlTextWriter)
            MyBase.Render(New CompressedHtmlTextWriter(writer))
        End Sub
    
        Protected Overrides Sub BeginRender(ByVal writer As System.Web.UI.HtmlTextWriter)
            MyBase.BeginRender(New CompressedHtmlTextWriter(writer))
        End Sub
    
        Protected Overrides Sub EndRender(ByVal writer As System.Web.UI.HtmlTextWriter)
            MyBase.EndRender(New CompressedHtmlTextWriter(writer))
        End Sub
    
    End Class
    
    Public Class CompressedHtmlTextWriter
        Inherits HtmlTextWriter
    
        Sub New(ByVal writer As HtmlTextWriter)
            MyBase.New(writer, "")
            Me.InnerWriter = writer.InnerWriter
    
            Me.NewLine = ""
        End Sub
    
        Sub New(ByVal writer As System.IO.TextWriter)
            MyBase.New(writer, "")
            MyBase.InnerWriter = writer
    
            Me.NewLine = ""
        End Sub
    
        Protected Overrides Sub OutputTabs()
            'Skip over the tabs
        End Sub
    
        Public Overrides Property NewLine() As String
            Get
                Return ""
            End Get
            Set(ByVal value As String)
                MyBase.NewLine = value
            End Set
        End Property
    
    
        Public Overrides Sub WriteLine()
    
        End Sub
    
        Public Overrides Sub WriteLine(ByVal value As Boolean)
            MyBase.Write(value)
        End Sub
    
        Public Overrides Sub WriteLine(ByVal value As Char)
            MyBase.Write(value)
        End Sub
    
        Public Overrides Sub WriteLine(ByVal buffer() As Char)
            MyBase.Write(buffer)
        End Sub
    
        Public Overrides Sub WriteLine(ByVal buffer() As Char, ByVal index As Integer, ByVal count As Integer)
            MyBase.Write(buffer, index, count)
        End Sub
    
        Public Overrides Sub WriteLine(ByVal value As Decimal)
            MyBase.Write(value)
        End Sub
    
        Public Overrides Sub WriteLine(ByVal value As Double)
            MyBase.Write(value)
        End Sub
    
        Public Overrides Sub WriteLine(ByVal value As Integer)
            MyBase.Write(value)
        End Sub
    
        Public Overrides Sub WriteLine(ByVal value As Long)
            MyBase.Write(value)
        End Sub
    
        Public Overrides Sub WriteLine(ByVal value As Object)
            MyBase.Write(value)
        End Sub
    
        Public Overrides Sub WriteLine(ByVal value As Single)
            MyBase.Write(value)
        End Sub
    
        Public Overrides Sub WriteLine(ByVal s As String)
            MyBase.Write(s)
        End Sub
    
        Public Overrides Sub WriteLine(ByVal format As String, ByVal arg0 As Object)
            MyBase.Write(format, arg0)
        End Sub
    
        Public Overrides Sub WriteLine(ByVal format As String, ByVal arg0 As Object, ByVal arg1 As Object)
            MyBase.Write(format, arg0, arg1)
        End Sub
    
        Public Overrides Sub WriteLine(ByVal format As String, ByVal arg0 As Object, ByVal arg1 As Object, ByVal arg2 As Object)
            MyBase.Write(format, arg0, arg1, arg2)
        End Sub
    
        Public Overrides Sub WriteLine(ByVal format As String, ByVal ParamArray arg() As Object)
            MyBase.Write(format, arg)
        End Sub
    
        Public Overrides Sub WriteLine(ByVal value As UInteger)
            MyBase.Write(value)
        End Sub
    
        Public Overrides Sub WriteLine(ByVal value As ULong)
            MyBase.Write(value)
        End Sub
    
    End Class
    

    如果您不熟悉控制适配器,只需将下面的xml放在ASP.NET应用程序浏览器文件夹。您可以更改controlType以将控件适配器应用于标签或其他用于较小测试范围的内容。如果我能让它工作,在这里添加我的项目中的所有控件并不是什么大事,如果有必要的话。

    <browsers>
    
        <browser refID="Default">
            <controlAdapters>
                <adapter controlType="System.Web.UI.Page"
                         adapterType="PageCompressorControlAdapter"/>
            </controlAdapters>
        </browser>
    
    </browsers>
    

    不管怎样,您可能会认为只有一个简单的配置设置,比如VerboseHtml=“false”或PreserveHtmlFormatting=“false”或类似的内容。如果你看看MSN.com网站,他们正在使用类似于这样的压缩方式…而且它看起来性能非常好。

    1 回复  |  直到 14 年前
        1
  •  1
  •   NightOwl888 Jabrwoky    10 年前

    解决方案是使用我在这里找到的压缩模块的改进版本:

    http://omari-o.blogspot.com/2009/09/aspnet-white-space-cleaning-with-no.html

    此解决方案实现了一个自定义PageParserFilter,然后在web.config文件文件。此解决方案的优点在于它在编译时过滤空白,因此在运行时不会影响性能。

    多亏了Aristos和diamandiev,我找到了一种合理的方法,为支持响应流的浏览器添加压缩。我在这里找到了另一个可用于此目的的开源模块: http://blowery.org/httpcompress/

    这两种方法结合使用时,性能的提高是显著的——远远超过使用其中一种或另一种方法。当标签从页面中移除时,浏览器呈现的速度似乎要快得多。

    至于静态内容,我计划使用本文中的方法来压缩这些文件(当然除了图像,它们已经被压缩了): http://www.lostechies.com/blogs/dahlbyk/archive/2010/01/08/script-to-enable-http-compression-gzip-deflate-in-iis-6.aspx

    最终解决方案

    this Gist .

    推荐文章