【问题标题】:Can ASP.NET MVC routing and a classic ASP homepage (VBScript, not web forms) play together nicely?ASP.NET MVC 路由和经典的 ASP 主页(VBScript,而不是 Web 表单)可以很好地配合使用吗?
【发布时间】:2010-10-12 18:59:02
【问题描述】:

我们网站的根目录中有一个经典的 VBScript“default.asp”页面。 (这是一个沉重的遗留页面,现在不能转换它。)我们还有一个新的 ASP.NET MVC 2 应用程序,我们希望在同一个站点上托管。一切实际上都很好!除了一件事:对站点根目录的请求(例如,/)被 MVC 路由(然后想要显示 HomeController 的索引操作)接收,而不是让 default.asp 页面接受请求!

这就是我想要的:
http://www.example.com/

我不知道如何执行HomeController.Index()。如果我删除 HomeController,我会收到错误消息。如果我尝试 IgnoreRoute("") 我得到一个错误。我什至更改了 IIS 中“默认文档”的优先级/顺序,以便该站点将“default.asp”视为首选文档。我什至已经从根目录中删除了虚拟 MVC“default.aspx”页面,但 MVC 路由仍然在“窃取”对站点根目录的请求。

临时解决方案是让 HomeController.Index 将用户重定向回“default.asp”。这可行,但随后它在地址栏中显示得很丑且可见,
http://www.example.com/default.asp

关于如何让这两者共存的任何建议/答案?也许我可以在 web.config 中添加一些东西来为主页设置这个特定的例外?谢谢!

更新

我为延迟回到这个问题而道歉,但它被搁置了一段时间,老实说,我几乎忘记了这一点;但是我确实设法让这个工作!我要感谢 Chris Marisic 和 Chance,因为他们联合起来帮助我解决了这个问题。

问题确实如此,似乎有一条默认路由(正如 Chance 在评论中建议的那样)将这些请求捕获到站点根目录。

因此,通过对此进行调整,并将routes.IgnoreRoute("");(空字符串)添加为我的路由列表中的第一条规则,现在可以使用了!

感谢大家的帮助!

【问题讨论】:

  • 我不确定这一点,但您是否尝试在您的路线配置中设置 RouteExistingFiles = true ?这是一个疯狂的猜测,可能是错误的,但值得一试。

标签: asp.net asp.net-mvc iis asp-classic routing


【解决方案1】:

这可能不是你想要的,但是试试 ASP Classic Compiler 之类的东西并将它添加到你的 Home Controler 中

http://aspclassiccompiler.codeplex.com/

问候

伊恩

【讨论】:

    【解决方案2】:

    您想将主路由添加到忽略路由列表中。

    类似的东西

    routes.IgnoreRoute("/");

    routes.IgnoreRoute("/default.asp");

    【讨论】:

    • 感谢您的回复,但不幸的是,这些都不起作用。我已经尝试过第一个,但它最终完全破坏了网站的其余部分(因为它匹配 too 我猜。)第二个是我试图避免的,而不是处理! (我提到我确实希望 default.asp 出现在地址栏中。)
    • 为什么routes.IgnoreRoute("/") 会破坏网站的其余部分?你有什么样的不良行为?
    • 原来routes.IgnoreRoute("") 以及删除捕获过多的默认路由已经解决了问题!
    【解决方案3】:

    对此我不确定,但您应该能够将 default.asp 添加到您的默认文件列表 (iis)。从那里,只需确保您的所有路线都有一个前缀(即:“something/{id}”)

    【讨论】:

    • 正如我的问题中所述,Default.asp 已经位于该站点的 IIS 中默认文档列表的最顶部。谢谢!
    • 啊,错过了。只要确保您没有可以赶上基本路线的路线即可。如果你有像 {controller}/{action}/{id} 这样所有参数都默认的路由,它会抓住它。就像我说的,确保你的 MVC 路由上有前缀,这样就不会发生。
    【解决方案4】:

    最简单的方法是使用子域。我遇到了类似的问题,我的解决方案是修改 asp 页面以将 xml 呈现为输出,并从 mvc 应用程序中抓取输出。

    【讨论】:

    • 如果可能,我们更愿意将它们保留在同一个站点和域中。谢谢你的建议!
    【解决方案5】:

    认为忽略路线应该可行,尽管这种行为可能会导致意想不到的后果。

    疯狂的回答:将页面移动到某处,使任何位于“~/”处的动作转过来并在该页面上创建WebRequest,然后将其作为内容发送到浏览器。

    【讨论】:

    • P.S.,我确实喜欢你的“疯狂谈话”回答,我也想到了它!然而,由于需要传递经典的 ASP 会话 cookie,它可能会涉及更多一些。但仍有可能!
    • 有时hack很有趣。尝试将忽略路线放在您的路线之后。并且一定要检查 MVCContrib 中的 MVC 路由调试器,它是天赐之物。
    【解决方案6】:

    我刚刚在我们的 Intranet 上处理了这个问题。

    假设routes.RouteExistingFiles = false; 主要问题是MVC 将基本根视为有效,因此IIS 不会尝试使用default.asp,因此您需要尝试以某种方式破坏它。我的建议是:

    移除控制器上的 Index 路由

    不仅是 Index 路由,还有指向 Index 的默认操作。如果 MVC 与根不匹配,则 IIS 可以尝试其默认值

    重定向

    您可以使用 Index 操作方法将 RedirectResult 提供给 default.asp。这是一个额外的循环,但也意味着如果/当您更新应用程序的该部分时,您只需替换 index 方法。

    网址重写

    这是我的首选解决方案,使用IIS URL Rewrite module,它非常强大,并为您提供了多种选择。您可以让它将重定向发送回浏览器到特定路由。更有趣的是,您可以让它重写 URL 以附加 default.asp。这意味着 MVC 会看到包含文件的 url,但不需要向浏览器发送重定向。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-04-04
      • 2012-01-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-13
      • 1970-01-01
      相关资源
      最近更新 更多