Vb.net 旧的经典ASP页面陷入MVC路径

Vb.net 旧的经典ASP页面陷入MVC路径,vb.net,model-view-controller,asp-classic,routing,redirect,Vb.net,Model View Controller,Asp Classic,Routing,Redirect,我正在将一个现有的经典ASP网站转换为(VB)MVC,我不希望任何现有的URL被破坏。我读过很多关于如何进行正确的301重定向的帖子(比如这篇:)。在最新的MVC版本中,我收集到了这一点 Response.RedirectPermanent(objRedirect.new_url, True) 这就是所需要的一切 我已经在一个数据库表中输入了我所有的旧URL,其中有一列对应的新URL。我在自定义404页面中添加了代码以获取原始URL: Dim strURL As String = Reques

我正在将一个现有的经典ASP网站转换为(VB)MVC,我不希望任何现有的URL被破坏。我读过很多关于如何进行正确的301重定向的帖子(比如这篇:)。在最新的MVC版本中,我收集到了这一点

Response.RedirectPermanent(objRedirect.new_url, True)
这就是所需要的一切

我已经在一个数据库表中输入了我所有的旧URL,其中有一列对应的新URL。我在自定义404页面中添加了代码以获取原始URL:

Dim strURL As String = Request.RawUrl.Substring(Request.RawUrl.IndexOf("aspxerrorpath=") + 15).ToLower()
这样我就可以在数据库里查到。(有趣的旁注,这里的MSDN文档——似乎是说,如果我在web.config的CustomErrors部分设置RedirectMode=ResponseRewrite,我就不必担心执行上述操作了,但当我尝试这样做时,我会收到IIS错误,说它不能服务于ASP页面?!?)

我遇到的问题是,任何与新MVC路由具有相同目录的旧的、经典的ASP URL都以某种方式被部分路由。例如,“/test/default.asp”在我的错误页面的上述strURL变量中显示为“/test/test”

我确实有“测试”的路由设置:

在Global.aspx.vb中,但我也尝试了所有可能的方法来忽略路由中的所有ASP页面(似乎没有用)。以下是我所做的尝试(我确实看到一篇2008年的老帖子,上面说我只能有一条“一网打尽”的忽略路线,但不知道这是否仍然有效?)

而且它们似乎都没有任何区别(很明显,我一次只试了一个)

这也不仅仅局限于一条路由——它适用于旧站点上存在的与新站点上的命名路由匹配的任何目录

提前感谢您提出的所有建议

更新:我发现了另外两个“问题”:

  • 我失去了最初的质询。因此,如果请求product.asp?id=1,我在错误页面中的所有内容都是product.asp(知道如何获取/保存原始查询字符串吗?)
  • 我的另一条路线如下所示:

    routes.MapRoute(“独立销售”_ “独立销售/{action}”_ 使用{.controller=“independentsales”,.action=“index”}新建


  • 当我请求“/resale/default.asp”时,它会转到“resale/independentsales”。这是怎么回事?

    你试过使用web.config吗

    <?xml version="1.0" encoding="UTF-8"?>
    <configuration>
        <system.webServer>
            <rewrite>
                <rules>
                    <rule name="Remove index.php" enabled="true" patternSyntax="ECMAScript" stopProcessing="true">
                        <match url="^(.*)$" />
                        <conditions logicalGrouping="MatchAll">
                            <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
                            <add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" />
                        </conditions>
                        <action type="Rewrite" url="index.php/{R:1}" />
                    </rule>
                </rules>
            </rewrite>
        </system.webServer>
    </configuration>
    
    
    

    上面的示例用于重写CodeIgniter应用程序,以从URL中省略index.php文件。考虑到条件,你可以用它做很多事情。在这种情况下,我只会在不是文件也不是目录的情况下进行重写。

    好的,经过数小时的阅读/研究/调试,我得出结论,我没有做错任何事情,Visual Studio、.NET、MVC中存在一些“错误”。。。某物我是对的!我从头开始创建了一个新项目,把我所有的代码都复制到那里,一切都正常工作

    (嗯,我不确定“应该”是正确的,但我确实让我的代码按我想要的方式运行。对ASP页面的请求仍然会遇到MVCAPApplication_BeginRequest-我认为他们不应该使用我的IgnoreRoute条目???-但至少扩展名到达时仍然在那里,所以我可以在数据库中查找ASP页面并执行重定向!)

    所以,这对我来说可能是独一无二的,但也许我可以让别人少受几个小时的挫折。。。如果你认为你所有的事情都是正确的,也许你是正确的!创建一个新项目并尝试

    。。。做一个程序员太糟糕了-D

    (沉思……我没有在新项目中添加的三件事是:

  • 埃尔玛测井仪
  • 路由逻辑DLL
  • 以及RouteDebugger.dll

  • 我可以试着从我的原始项目中减去它们,看看效果如何。考虑到ELMAH的受欢迎程度以及谁编写了路由,我无法想象它们会有问题,但谁知道…?)

    我想你指的是微软的URLRewriter工具?我确实看到了,但由于我们的网站是由ISP托管的,我不确定我是否能够安装它,所以我尽量不去那里。我不能确认这一点,但任何支持ASP.Net的主机都支持web.config文件。您可以在计算机中创建它(手动或使用IIS)并将其上载到应用程序根目录。这是IIS 7及更高版本的标准功能。我确实将重写代码添加到了我的web.config中,但它什么也没做。我很确定你必须在IIS中安装URLRewite代码,它才能工作。你说得对。但我认为这是IIS 7+的一个标准功能。你是否已经完全迁移了系统,或者你仍然依赖旧的asp页面?还有一个“啊哈时刻”(或者“啊哈时刻”!?!?!?!)是,当你测试永久重定向并第一次出错时,你的浏览器会“记住”将来对该URL的所有测试都不会通过您的代码,而是您的浏览器只是重定向它(…我没有想到为什么我没有达到代码断点!)
    routes.IgnoreRoute("{file}.asp")
    routes.Ignore("{resource}.asp/{*pathInfo}")
    routes.IgnoreRoute("{resource}.asp/{*pathInfo}")
    routes.Add(New Route("{resource}.asp/{*pathInfo}", New StopRoutingHandler()))
    
    <?xml version="1.0" encoding="UTF-8"?>
    <configuration>
        <system.webServer>
            <rewrite>
                <rules>
                    <rule name="Remove index.php" enabled="true" patternSyntax="ECMAScript" stopProcessing="true">
                        <match url="^(.*)$" />
                        <conditions logicalGrouping="MatchAll">
                            <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
                            <add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" />
                        </conditions>
                        <action type="Rewrite" url="index.php/{R:1}" />
                    </rule>
                </rules>
            </rewrite>
        </system.webServer>
    </configuration>