搜索引擎 asp.net 基本优化

设置组件
<configSections> 
    <section name="rewriter"  requirePermission="false" type="Intelligencia.UrlRewriter.Configuration.RewriterConfigurationSectionHandler, Intelligencia.UrlRewriter"/>
</configSections>
设置模块
<httpModules>
    <add type="Intelligencia.UrlRewriter.RewriterHttpModule,Intelligencia.UrlRewriter" name="UrlRewriter" />
</httpModules>
设置重写规则
<rewriter>
    <!--
        注册自定义规则 对应下面Rule 标记 ,可以根据(自定义类名.Name)属性的具体返回值决定标记名称。
    -->
    <register parser="Test.RewriteActionParser, Test" />
    <!--
        rule 为自定义规则识别标记对应自(定义规则类.name)属性
        url 定义源地址,在request.location中包含相应地址
        to 重写目标地址,将request.location拼接值此地之后重写
    -->
    <Rule url="~/d" to="~/default.aspx" />
  </rewriter>

自定义规则类
Public Class RewriteActionParser
    Implements IRewriteActionParser

    Public ReadOnly Property AllowsAttributes() As Boolean Implements Intelligencia.UrlRewriter.IRewriteActionParser.AllowsAttributes
        Get
            Return True
        End Get
    End Property

    Public ReadOnly Property AllowsNestedActions() As Boolean Implements Intelligencia.UrlRewriter.IRewriteActionParser.AllowsNestedActions
        Get
            Return False
        End Get
    End Property

    Public ReadOnly Property Name() As String Implements Intelligencia.UrlRewriter.IRewriteActionParser.Name
        Get
     '返回规则标记名称<Rule url="~/d" to="~/default.aspx" />
            Return "Rule"
        End Get
    End Property

    Public Function Parse1(ByVal node As System.Xml.XmlNode, ByVal config As Object) As Intelligencia.UrlRewriter.IRewriteAction Implements Intelligencia.UrlRewriter.IRewriteActionParser.Parse
        If node Is Nothing Then
            Throw New ArgumentNullException("node")
        End If
        If config Is Nothing Then
            Throw New ArgumentNullException("conditions")
        End If
 '执行自定义动作,该动作处理所有需要处理的操作,在构造是将获取的找到的规则XML对象传入。
        Return New RewriteAction(node)
    End Function
End Class

自定义动作类

Public Class RewriteAction
    Implements IRewriteAction

    Public _node As XmlNode
    Public Sub New(ByVal location As XmlNode)
        _node = location
    End Sub

    Public Function Execute(ByVal context As Intelligencia.UrlRewriter.RewriteContext) As Intelligencia.UrlRewriter.RewriteProcessing Implements Intelligencia.UrlRewriter.IRewriteAction.Execute
        Dim _url As String = _node.Attributes("url").Value
        Dim _to As String = _node.Attributes("to").Value
        Dim lo As String = context.Location
        Dim yu As String = context.ResolveLocation(_url)
        Dim lu As String = lo

        If yu(yu.Length - 1).ToString <> "/" Then yu += "/"
        If lu(lu.Length - 1).ToString <> "/" Then lu += "/"

        Dim a As String = ""
        If lu.IndexOf(yu) = 0 Then
            Dim url As String = context.ResolveLocation(_to)
            Dim param As String = lo.Remove(0, context.ResolveLocation(_url).Length)
            If param <> String.Empty Then
                param = FormatParam(param)
                If url.IndexOf("?") > 0 Then
                    If url.IndexOf("?") <> url.Length - 1 Then url += "&"
                Else
                    url += "?"
                End If
                url += param
            End If
            context.Location = Uri.EscapeUriString(url)
            Return RewriteProcessing.StopProcessing
        Else
            Return RewriteProcessing.ContinueProcessing
        End If
    End Function

    '格式化参数 从 参数名/值/参数名/值 转成 参数名=值&参数名=值
    Public Function FormatParam(ByVal par As String) As String
        Dim strparam As String = ""
        If par Is Nothing Or par = String.Empty Then
            Return strparam
        End If
        If par(0) = "/" Then
            par = par.Remove(0, 1)
        End If

        Dim param() As String = par.Split("/")

        If param.Length Mod 2 <> 0 Then
            'Throw New Exception("paramter is not mod two")
            Return "?" + par
        End If
        Dim i As Integer

        For i = 1 To param.Length Step 2
            If strparam <> String.Empty Then
                strparam += "&"
            End If
            strparam += param(i - 1) + "=" + param(i)
        Next
        Return strparam
    End Function
End Class


修改ViewState位置 需要在浏览器文件中进行注册
Public Class FormRewriterViewStateControlAdapter
    Inherits ControlAdapter

    Protected Overrides Sub Render(ByVal writer As System.Web.UI.HtmlTextWriter)
        Dim sw As New IO.StringWriter
        Dim hw As New HtmlTextWriter(sw)
        MyBase.Render(hw)

        Dim viewStateRegex As New Regex("(<input type=""hidden"" name=""__VIEWSTATE"" id=""__VIEWSTATE"" value=""/w(.*)"" />)", RegexOptions.Multiline)
        Dim endFormRegex As New Regex("</form>", RegexOptions.Multiline)

        Dim html As String = sw.ToString()
        Dim viewStateMatch As Match = viewStateRegex.Match(html)
        Dim viewStateString As String = viewStateMatch.Captures(0).Value
        html = html.Remove(viewStateMatch.Index, viewStateMatch.Length)

        writer.Write(html)
    End Sub
End Class

浏览器文件 .browser
<browsers>
  <browser refID="Default">
    <controlAdapters>
      <adapter controlType="System.Web.UI.HtmlControls.HtmlForm" adapterType="Intelligencia.UrlRewriter.FormRewriterControlAdapter" /> <!--修改FORM ACTION值-->
      <adapter controlType="System.Web.UI.HtmlControls.HtmlForm" adapterType="Test.FormRewriterViewStateControlAdapter" /> <!--修改VIEWSTATE位置-->
    </controlAdapters>
  </browser>
</browsers>

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章