2012-04-19 151 views
1

我有这样的MapPageRoute在我的Global.asax .asp页Asp.Net 4.0:忽略路由的路由

RouteTable.Routes.MapPageRoute("TestPages", "{file}", "~/Test/{file}"); 

它基本上是说,如果请求来自于它进入test文件夹中的任何文件。不过,我想限制它,只有在URL中没有asp扩展时,才会执行此规则。所以,如果用户输入Test.asp,则不会发生URL路由。但是如果它像http://www.something.com/Test/这样的路线应该执行。

我该如何做到这一点?

+0

尝试将此作为定义中的第一条路线。 routes.Ignore( “{}资源的.asp”); – 2012-04-19 12:36:23

回答

2

要忽略的路线尝试使用以下:

RouteTable.Routes.Ignore("{resource}.asp/{*pathInfo}"); 

改变 '的.asp'到您想要过滤的类型。

2

我为此使用了一个约束。示例:

routes.MapPageRoute("CMS", "{*friendlyUrl}", "~/index.aspx", true, null, new RouteValueDictionary { { "incomingUrl", new CatchallConstraint() } }); 

其中CatchallContraint是必须实现IRouteConstraint的类。

在Match方法中,只需检查文件扩展名,如果它是一个asp扩展名,则返回false。

这里是我的实现(vb.net) - 它比你需要的多一点,因为它可以在web.config中配置,但你明白了。

公共类CatchallConstraint 实现System.Web.Routing.IRouteConstraint

''' <summary> 
''' If AppSettings: CatchallIgnoredExtensions doesn't exist, these are the default extensions to ignore in the catch-all route 
''' </summary> 
''' <remarks></remarks> 
Public Const DefaultIgnoredExtensions As String = ".jpg,.gif,.png" 

''' <summary> 
''' For the catch-all route, checks the AppSettings: CatchallIgnoredExtensions to determine if the route should be ignored. 
''' Generally this is for images - if we got to here that means the image was not found, and there's no need to follow this route 
''' </summary> 
Public Function Match(ByVal httpContext As System.Web.HttpContextBase, ByVal route As System.Web.Routing.Route, ByVal parameterName As String, ByVal values As System.Web.Routing.RouteValueDictionary, ByVal routeDirection As System.Web.Routing.RouteDirection) As Boolean Implements System.Web.Routing.IRouteConstraint.Match 
    If routeDirection = Routing.RouteDirection.IncomingRequest Then 
     Dim friendlyUrl As String = Nothing 
     If values.TryGetValue("friendlyUrl", friendlyUrl) AndAlso Not String.IsNullOrEmpty(friendlyUrl) Then 
      If friendlyUrl.Contains(".") Then 
       Dim catchallIgnoredExtensions As String = ConfigurationManager.AppSettings("CatchallIgnoredExtensions") 
       ' only set defaults if the setting is not found - user may not want to ignore any extensions 
       If catchallIgnoredExtensions Is Nothing Then 
        catchallIgnoredExtensions = DefaultIgnoredExtensions 
       End If 
       ' replace spaces and period to standardize, surround the extensions in commas for searching 
       catchallIgnoredExtensions = "," & catchallIgnoredExtensions.Replace(" ", "").Replace(".", "").ToLowerInvariant() & "," 
       Dim extension As String = System.IO.Path.GetExtension(friendlyUrl).Replace(".", "") 
       If catchallIgnoredExtensions.Contains("," & extension & ",") Then 
        Return False 
       End If 
      End If 
     End If 
    End If 
    Return True 
End Function 

末级

+0

谢谢。但Psycho的解决方案要好得多。 – Jack 2012-04-19 14:01:09

+0

@TomKaufmann他的解决方案不适用于超出根目录的.asp扩展名。 – ScottE 2012-04-19 14:29:00

+0

实际上,我只有根目录下的asp页面。 – Jack 2012-04-20 07:38:35