Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/30.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net 为什么RedirectToRoutePermanent添加了;计数=0“;询问?_Asp.net_Vb.net_Routing_Url Redirection - Fatal编程技术网

Asp.net 为什么RedirectToRoutePermanent添加了;计数=0“;询问?

Asp.net 为什么RedirectToRoutePermanent添加了;计数=0“;询问?,asp.net,vb.net,routing,url-redirection,Asp.net,Vb.net,Routing,Url Redirection,我正在使用ASP.NET 4.0路由,正在从数据库中读取路由信息并添加路由,如下所示。简而言之,我的自定义对象“RouteLookup”包含路由信息,包括它可能重定向到或不重定向到的另一个RouteLookup的ID。下面是数据库中两个RouteLookup条目的示例: RouteLookupID RouteName RelativePath RequestHandler RouteHandler IsSecure RedirectedToRoute

我正在使用ASP.NET 4.0路由,正在从数据库中读取路由信息并添加路由,如下所示。简而言之,我的自定义对象“RouteLookup”包含路由信息,包括它可能重定向到或不重定向到的另一个RouteLookup的ID。下面是数据库中两个RouteLookup条目的示例:

    RouteLookupID   RouteName       RelativePath    RequestHandler  RouteHandler    IsSecure    RedirectedToRoute
    13              PrivacyRoute    about/privacy   privacy.aspx    NULL               0             0
    14              PrivacyRoute1   privacy         privacy.aspx    NULL               0             13       
RouteLookupID 14是需要永久重定向到RouteLookupID 13的传统路由。我遇到的问题是,当我从浏览器请求“”并查看Fiddler结果时,它实际上会重定向两次,并添加一个“count=0”作为查询字符串参数!我不知道这个参数是从哪里来的,因为我没有明确添加这个参数的进程、httphandler等

这里到底发生了什么事?非常感谢您的任何想法,下面是相关代码的其余部分

我有一个类BaseRoute,它继承自Route,因此我可以将我的自定义RouteLookup对象连同它一起传递给自定义RouteHandler,以便在我命名为BaseRouteHandler的自定义RouteHandler中进行检查

Public Class PageRouter

Private Shared db As New QADBDataContext

''''''' Is called from Global Application_Start
Public Shared Sub MapRoutes(routeColl As RouteCollection)

    Dim routeLookups As IEnumerable(Of RouteLookup) = From rt In db.RouteLookups Select rt

    For Each rtLookUp As RouteLookup In routeLookups
        Dim parameterizedURL As String = BuildParameterizedVirtualPath(rtLookUp)

            ' Determine handler and route values
            If rtLookUp.RouteHandler Is Nothing Then
                RouteTable.Routes.Add(rtLookUp.RouteName, New BaseRoute(parameterizedURL, New BaseRouteHandler(), rtLookUp))
            Else
                RouteTable.Routes.Add(rtLookUp.RouteName, New BaseRoute(parameterizedURL, Activator.CreateInstance(Type.GetType("QA." + rtLookUp.RouteHandler)), rtLookUp))
            End If            
    Next
End Sub

Protected Shared Function BuildParameterizedVirtualPath(rtLookUp As RouteLookup) As String

    Dim parameterizedURL As String = rtLookUp.RelativePath
    For Each param As RouteParameter In rtLookUp.RouteParameters
        parameterizedURL &= "/{" + param.Name + "}"
    Next
    Return parameterizedURL

End Function

Public Shared Sub RedirectToRoutePermanent(rtData As RouteData)

    Dim route As BaseRoute = DirectCast(rtData.Route, BaseRoute)
    Dim rtLookup As RouteLookup = route.RouteLookup
    Dim newRtLookupID As Integer = rtLookup.RedirectedToRoute
    Dim newRtLookup As RouteLookup = (From rt In db.RouteLookups Where rt.RouteLookupID = newRtLookupID).SingleOrDefault
    HttpContext.Current.Response.RedirectToRoutePermanent(newRtLookup.RouteName, rtData.Values.Values)

End Sub
End Class
自定义路线类别:

Public Class BaseRoute
Inherits Route

Private _routeLookup As RouteLookup = Nothing

Public Sub New(url As String, routeHandler As IRouteHandler, routeLookup As RouteLookup)
    MyBase.New(url, routeHandler)
    _routeLookup = routeLookup

End Sub

Public ReadOnly Property RouteLookup As RouteLookup
    Get
        Return _routeLookup
    End Get
End Property
End Class
自定义路由管理器:

Public Class BaseRouteHandler
Implements IRouteHandler

Protected _baseRoute As BaseRoute = Nothing
Protected _rtLookup As RouteLookup = Nothing

Protected Overridable Sub InitializeContext(ByVal requestContext As System.Web.Routing.RequestContext)

    _baseRoute = DirectCast(requestContext.RouteData.Route, BaseRoute)
    _rtLookup = _baseRoute.RouteLookup

End Sub


Public Function GetHttpHandler(ByVal requestContext As System.Web.Routing.RequestContext) _
                        As System.Web.IHttpHandler Implements System.Web.Routing.IRouteHandler.GetHttpHandler

    InitializeContext(requestContext)
    EnforceURLStandard(requestContext)
    PerformRedirectIfNeeded(requestContext)
    Return GetPageHandler(requestContext)

End Function


Protected Overridable Sub PerformRedirectIfNeeded(ByVal requestContext As System.Web.Routing.RequestContext)

    If _rtLookup.RedirectedToRoute > 0 Then
        PageRouter.RedirectToRoutePermanent(requestContext.RouteData)
    End If

End Sub


Protected Sub EnforceURLStandard(ByVal requestContext As System.Web.Routing.RequestContext)

    ' Test for:
    '   * Proper protocol
    '   * www. exists
    '   * must be all lowercase

    Dim scheme As String = HttpContext.Current.Request.Url.GetComponents(UriComponents.Scheme, UriFormat.UriEscaped)
    Dim rightSide As String = HttpContext.Current.Request.Url.GetComponents(UriComponents.HostAndPort Or UriComponents.PathAndQuery, UriFormat.UriEscaped)
    Dim newURL As String = Nothing

    If Not rightSide.ToLower().StartsWith("www.") AndAlso Not rightSide.ToLower().StartsWith("localhost") _
        AndAlso Not rightSide.ToLower().StartsWith("uat") AndAlso Not rightSide.ToLower().StartsWith("ux") Then
        newURL = scheme & "://www." & rightSide
    End If

    If _rtLookup.IsSecure <> requestContext.HttpContext.Request.IsSecureConnection Then
        Dim newScheme As String = If(_rtLookup.IsSecure, "https", "http")
        newURL = newScheme & rightSide
    End If

    Dim pattern As String = "[A-Z]"
    If Not String.IsNullOrWhiteSpace(newURL) Then
        If Regex.IsMatch(newURL, pattern) Then
            newURL = newURL.ToLower()
        End If
    Else
        If Regex.IsMatch(HttpContext.Current.Request.Url.ToString(), pattern) Then
            newURL = HttpContext.Current.Request.Url.ToString().ToLower()
        End If
    End If

    If Not newURL Is Nothing Then
        HttpContext.Current.Response.RedirectPermanent(newURL, True)
    End If

End Sub

Protected Overridable Function GetPageHandler(ByVal requestContext As System.Web.Routing.RequestContext) As System.Web.IHttpHandler

    Return TryCast(BuildManager.CreateInstanceFromVirtualPath("/" & _rtLookup.RequestHandler, GetType(Page)), Page)

End Function

End Class
公共类BaseRouteHandler
实现IRouteHandler
受保护的_baseRoute作为baseRoute=无
受保护的_rtLookup作为RouteLookup=Nothing
受保护的可重写子InitializeContext(ByVal requestContext作为System.Web.Routing.requestContext)
_baseRoute=DirectCast(requestContext.RouteData.Route,baseRoute)
_rtLookup=\u baseRoute.RouteLookup
端接头
公共函数GetHttpHandler(ByVal requestContext作为System.Web.Routing.requestContext)_
正如System.Web.IHttpHandler实现System.Web.Routing.IRoutHandler.GetHttpHandler一样
InitializeContext(请求上下文)
EnforceURLStandard(requestContext)
PerformReciptionRequired(请求上下文)
返回GetPageHandler(requestContext)
端函数
受保护的可重写子性能需要(ByVal requestContext作为System.Web.Routing.requestContext)
如果_rtLookup.RedirectedToRoute>0,则
PageRouter.RedirectToRoutePermanent(requestContext.RouteData)
如果结束
端接头
受保护的子EnforceURLStandard(ByVal requestContext作为System.Web.Routing.requestContext)
“测试:
“*适当的协议
“*www.exists
“*必须全部小写
Dim scheme As String=HttpContext.Current.Request.Url.GetComponents(UriComponents.scheme,UriFormat.UriEscaped)
右侧标注为String=HttpContext.Current.Request.Url.GetComponents(UriComponents.HostAndPort或UriComponents.PathAndQuery,UriFormat.UriEscaped)
Dim newURL作为字符串=无
如果不是righside.ToLower().StartsWith(“www.”),也不是righside.ToLower().StartsWith(“localhost”)_
也不是右侧。ToLower().StartsWith(“uat”)也不是右侧。ToLower().StartsWith(“ux”)然后
newURL=scheme&“://www.”右侧(&R)
如果结束
如果_rtLookup.IsSecure requestContext.HttpContext.Request.IsSecureConnection,则
Dim newScheme As String=If(_rtLookup.IsSecure,“https”,“http”)
newURL=新闻模式和右侧
如果结束
将图案变暗为字符串=“[A-Z]”
如果不是String.IsNullOrWhiteSpace(newURL),则
如果Regex.IsMatch(newURL,pattern)那么
newURL=newURL.ToLower()
如果结束
其他的
如果Regex.IsMatch(HttpContext.Current.Request.Url.ToString(),pattern)则
newURL=HttpContext.Current.Request.Url.ToString().ToLower()
如果结束
如果结束
如果不是,那么newURL什么都不是
HttpContext.Current.Response.RedirectPermanent(newURL,True)
如果结束
端接头
受保护的可重写函数GetPageHandler(ByVal requestContext作为System.Web.Routing.requestContext)作为System.Web.IHttpHandler
返回TryCast(BuildManager.CreateInstanceFromVirtualPath(“/”&_rtLookup.RequestHandler,GetType(Page)),Page)
端函数
末级

好吧,弄清楚这里发生了什么。RedirectToRoutePermanent不像RedirectPermanent(url,true)那样终止请求。我重新编写了PageRouter.RedirectToRoutePermanent,解决了以下问题:

 Public Shared Sub RedirectToRoutePermanent(rtData As RouteData)

    Dim route As BaseRoute = DirectCast(rtData.Route, BaseRoute)
    Dim rtLookup As RouteLookup = route.RouteLookup
    Dim newRtLookupID As Integer = rtLookup.RedirectedToRoute
    Dim newRtLookup As RouteLookup = (From rt In db.RouteLookups Where rt.RouteLookupID = newRtLookupID).SingleOrDefault

    Dim hostAndPort As String = HttpContext.Current.Request.Url.GetComponents(UriComponents.HostAndPort, UriFormat.UriEscaped)
    Dim newURL As String = Nothing

    Dim scheme As String = If(rtLookup.IsSecure, "https", "http")
    newURL = scheme & "://" & hostAndPort
    newURL &= "/" & newRtLookup.RelativePath

    If rtData.Values.Count > 1 Then
        For i As Integer = 1 To rtData.Values.Count - 1
            newURL &= "/" & rtData.Values(i)
        Next
    End If

    HttpContext.Current.Response.RedirectPermanent(newURL, True)

End Sub