设置组件
<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>