搜索引擎 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>

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