Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/37.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 处理IIS重写规则中可选URL参数的动态数量_Asp.net_Iis_Url Rewriting_Url Rewrite Module - Fatal编程技术网

Asp.net 处理IIS重写规则中可选URL参数的动态数量

Asp.net 处理IIS重写规则中可选URL参数的动态数量,asp.net,iis,url-rewriting,url-rewrite-module,Asp.net,Iis,Url Rewriting,Url Rewrite Module,我的场景如下:一个场馆可以是多个类别的一部分,用户也可以在多个类别类型上添加过滤器,因此我的URL现在如下所示: /场馆/海滩/船只/主题公园 (这将显示所有海滩、船只和路标的场馆) /场馆/海滩/船只 /场馆等 因此,不同场馆类型(海滩、船只、人行道等)的数量既动态又可选。我如何设置重写规则,使categoryquerystring参数包含所有不同的场馆类型,或者最好是多次添加category参数,如果没有提供venuetype,则category将为空/空 所以对于URL:/场馆/海滩/船只

我的场景如下:一个场馆可以是多个类别的一部分,用户也可以在多个类别类型上添加过滤器,因此我的URL现在如下所示:

  • /场馆/海滩/船只/主题公园
    (这将显示所有海滩、船只和路标的场馆)
  • /场馆/海滩/船只
  • /场馆
  • 因此,不同场馆类型(海滩、船只、人行道等)的数量既动态又可选。我如何设置重写规则,使
    category
    querystring参数包含所有不同的场馆类型,或者最好是多次添加
    category
    参数,如果没有提供venuetype,则
    category
    将为空/空

    所以对于URL:
    /场馆/海滩/船只/主题公园

    我会得到这个重写的URL:
    search.aspx?category=beats&category=boats&category=themeparks

    网址:
    /ventions

    我会得到这个重写的URL:
    search.aspx?category=
    (或者也可以是:
    search.aspx

    我现在只有这个:

    <rule name="venue types">
      <match url="^venues/([a-zA-Z0-9-+']+)$"/>
      <action type="Rewrite" url="search.aspx?category={R:1}"/>
    </rule>
    
    global.aspx.vb
    中,我添加了:

    Sub Application_Start(ByVal sender As Object, ByVal e As EventArgs)
        RouteConfig.RegisterRoutes(RouteTable.Routes)
    End Sub
    
    当我转到
    www.example.com/test
    时,它现在确实正确地将我重定向到contact.aspx。(请注意:URL重写-因此
    web.config
    rewriteRules.config
    文件中的规则-优先于
    RouteConfig.vb
    !)

    我快到了,所以这个
    www.example.com/test
    会正确重定向到文件
    contact.aspx
    但是这个
    www.example.com/test/boats/outside/more/fields/are/here
    ,抛出了一个404错误:

    更新2

    我将日志记录添加到
    routeConfig.vb

        GlobalFunctions.Log("1")
        Dim settings = New FriendlyUrlSettings()
        GlobalFunctions.Log("2")
        settings.AutoRedirectMode = RedirectMode.Permanent
        GlobalFunctions.Log("3")
        routes.EnableFriendlyUrls(settings)
        GlobalFunctions.Log("4")
        routes.MapPageRoute("", "test", "~/contact.aspx")
        GlobalFunctions.Log("5")
    
    这些行都被执行了。现在发生了一些奇怪的事情: routeConfig.vb似乎只执行一次。因此:

  • 我构建我的应用程序
  • 我转到
    /test
    URL
  • 这些行被记录下来,我到达
    contact.aspx
    页面
  • 我刷新/测试页面,没有记录任何行
  • 我也试过:

  • 我构建我的应用程序
  • 我转到
    /test/boats/out/more/fields/are/here
    URL
  • 线路被记录下来了
  • 我得到了前面提到的404错误
  • 我刷新页面,不再记录任何内容
  • 因此,似乎routeConfig只被点击一次(在应用程序启动时?),然后再也不会被点击。对于请求
    /test/boats/out/more/fields/are/here
    ,它会到达routeConfig.vb文件,但由于某些原因,它不会显示
    contact.aspx

    更新3

    我发现,当我明确定义路由时,它确实有效,如下所示:

    routes.MapPageRoute("", "test", "~/contact.aspx")
    routes.MapPageRoute("", "test/123", "~/contact.aspx")
    
    因此,现在URL
    /test
    /test/123
    可以工作了,但这根本不是动态的,因为我只想匹配
    /test
    ,然后获得友好的URL片段

    我无法将代码发布到网上,因此,如果有帮助,下面是我的解决方案资源管理器:


    我能做什么?

    要获得这种SEO友好的URL,您需要安装“Microsoft.AspNet.friendlyURL”nuget软件包

    打开包管理器控制台-。然后键入以下内容——

    安装软件包Microsoft.AspNet.FriendlyURL

    然后它会自动在RouteConfig.cs中添加以下内容

    public static class RouteConfig
    {
       public static void RegisterRoutes(RouteCollection routes)
       {
          var settings = new FriendlyUrlSettings();
          settings.AutoRedirectMode = RedirectMode.Permanent;
          routes.EnableFriendlyUrls(settings); 
        }
    }
    
    对于您的情况,您需要将以下内容添加到
    RouteConfig.cs

    routes.MapPageRoute(“,”场馆“,“~/victions.aspx”)

    所以当你点击url
    http://www.example.com/venues/beaches/boats/themeparks
    http://www.example.com/venues/beaches
    ,它将访问
    场馆.aspx
    。在
    场馆.aspx.cs
    页面加载
    事件中,您需要有以下代码

    IList str=Request.GetFriendlyUrlSegments()

    对于案例1,str将是
    [“海滩”、“船只”、“码头”]
    ,而对于案例2,str将是
    [“海滩”]

    有关更多信息,您可以参考或类似信息,请在此处回答-


    如果您面临任何问题或您的问题仍未解决,请告诉我。

    您可以关注我的博客-,您可以使用
    请求。GetFriendlyURLSegments
    ,它将返回您的值数组,即
    场馆/X/Y/Z
    的值将是
    [X,Y,Z]
    ,如果您需要更多详细信息,我可以将此作为答案发布。@ArindamNayak谢谢。是的,建议在SO上回答问题的方法是始终在SO上回答问题(外部站点可能会在将来被删除)。所以,是的,我希望你的答案在这里,适用于我的场景:)再次感谢!我已将我的建议作为答案发布。您是否可以尝试删除
    rewriteRules.config
    ,然后重试。我正在查看Visual Studio中的NuGet软件包管理器,查看
    Microsoft.AspNet.FriendlyUrls
    ,以及
    Microsoft.AspNet.FriendlyUrls.Core
    ,后者的描述似乎更符合我的需要。我需要哪一个?我正在使用VB.NET,但还没有RouteConfig文件…这有关系吗?我建议使用
    Microsoft.AspNet.FriendlyURL
    ,如果失败,那么使用第二个。你可以选择一个简单的基于MVC的项目(一个辅助项目),如果它在那里有效的话,那么你可以选择组件并使它与现有的一个一起工作。谢谢,我马上就到了,我想,最后一个错误似乎会把我甩了……看我更新的帖子。希望你能帮忙!(ps我为许多帖子更新道歉)@Flo,应该可以,你能在github或zip文件中共享你的项目吗?不幸的是,我不能这样做…我现在完全删除了rewriteRules.config,但错误仍然存在…我在我原来的帖子中添加了
    update2
    部分…你还有其他调试建议吗?再次感谢!
    public static class RouteConfig
    {
       public static void RegisterRoutes(RouteCollection routes)
       {
          var settings = new FriendlyUrlSettings();
          settings.AutoRedirectMode = RedirectMode.Permanent;
          routes.EnableFriendlyUrls(settings); 
        }
    }