【问题标题】:ASP.NET MVC IgnoreRoute method doesn't work correctly when URL starts with "/Views/"当 URL 以“/Views/”开头时,ASP.NET MVC IgnoreRoute 方法无法正常工作
【发布时间】:2011-09-05 08:57:29
【问题描述】:

我在我的应用程序中使用 ASP.NET MVC。
用户可以通过将它们包含在页面上来指定自己的图像、样式、脚本。
但是当他们指定不存在的文件的 URL 时,路由机制会尝试通过 URL 来查找控制器和操作到图像或样式等。

我添加了一个方法 IgnoreRoute 并在那里指定了我不想通过路由处理的所有扩展。

它可以正常工作,直到 URL 不以“Views/...”开头。
在这种情况下,URL 会传递到应用程序并在应用程序内部执行错误 404。
但我想用 IIS 处理这个错误。

这可以用空项目进行测试。 您可以简单地将此代码用于 Global.asax.cs 文件:

using System; using System.Web.Mvc; using System.Web.Routing; namespace MvcApplication1 { public class MvcApplication : System.Web.HttpApplication { public static void RegisterRoutes(RouteCollection routes) { routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); routes.IgnoreRoute( "{*staticfile}", new { staticfile = @".*\.(jpg|gif|jpeg|png|js|css|htm|html|htc)$" } ); routes.MapRoute( "Default", // Route name "{controller}/{action}/{id}", // URL with parameters new { controller = "Home", action = "Index", id = "" } // Parameter defaults ); } protected void Application_Start() { RegisterRoutes(RouteTable.Routes); } void Application_Error(object sender, EventArgs e) { } } }

现在我们需要在 IIS 上托管这个应用程序,例如http://localhost/testmvc/

您可以在 Application_Error 方法内部放置一个断点,以查看应用程序内部何时执行错误

所以现在打开测试网址: http://localhost/testmvc/test.css
我们可以看到 IIS 处理了该错误:

现在我们在路径中打开另一个带有“/Views/...”的测试 URL: http://localhost/testmvc/Views/test.css
我们看到错误是由 ASP.NET 处理的:

所以问题是:也许存在一些设置来告诉 MVC 不处理路径中带有“视图”的 URL?

【问题讨论】:

    标签: asp.net-mvc asp.net-mvc-routing ignoreroute


    【解决方案1】:

    这是我的方式:

    1- 在 Views 文件夹中创建一个新文件夹,例如。我的文件夹

    2- 将您的静态页面添加到这个新文件夹中,例如。文件名.cshtml

    3- 从“Views”文件夹中复制 web.config 文件并将其粘贴到您刚刚创建的新文件夹中 已创建(我的文件夹)

    4- 在新的 web.config 中替换 这个:

     <add path="*.*" verb="*" type="System.Web.HttpNotFoundHandler"/>
    

    有了这个:

    <add path="*.*" verb="*" type="System.Web.DefaultHttpHandler"/>
    

    5- 如果你找到了这些行,请删除它:

       <remove name="BlockViewHandler"/>
          <add name="BlockViewHandler" path="*" verb="*" preCondition="integratedMode"            type="System.Web.HttpNotFoundHandler" />
    

    结果: 现在这个文件夹中的任何文件都可以在没有路由的情况下工作!

    【讨论】:

      【解决方案2】:

      默认情况下,MVC 不允许您直接寻址 /Views 文件夹下的项目,因为所有文件类型都映射到 System.Web.HttpNotFoundHandler。

      要解决这个问题,请更改 /Views/web.config 中的定义,告诉它基本上忽略该位置的所有其他内容

      我基于此写了一篇博客文章,因为如果您想包含多种文件类型,IIS 6 与 7 不同。看: http://completedevelopment.blogspot.com/2011/06/using-views-outside-of-views-or-other.html

      【讨论】:

      • 我也想通了。但是 MVC 为这些 URL 提供了 HttpException 和 httpcode=404。那么为什么它不能将此 url 传递给 IIS 呢?也许您知道如何只允许访问 /Views 文件夹下的静态文件?或者是 MVC 的限制,我应该在 Application_Error 方法中处理这种情况?
      • 因为.net中设置了404的响应码,抛出了异常。 IIS 将不会处理它,因为此错误的来源在 .net 代码中。在另一种情况下,.Net 完全忽略任何处理,因此 IIS 处理它。
      • @Adam Tuliper 和诸如此类的事实使得处理 ASP.NET 和 IIS 自定义错误能够处理完全的巫术,您可以花几天时间尝试让它完美地工作。
      • 哈哈.. 是的。不过公平地说.. 大多数人会将其他内容排除在 /views 之外-您在这里有一个特殊情况-但我知道-这是处理来龙去脉时的学习曲线:)
      • @Adam Tuliper 我也研究了这个问题,并找到了与您在评论版本中描述的完全相同的解决方案。罪魁祸首原来是文件夹“Views”内web.config中IIS配置的“handler”部分中的“BlockViewHandler”所以问题现在解决了。感谢合作。
      猜你喜欢
      • 2012-10-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多