設置組件
<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>