当URL以“/ Views /”开头时,ASP.NET MVC IgnoreRoute方法无法正常工作

时间:2011-05-31 10:09:40

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

我在我的应用程序中使用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处理了该错误: enter image description here

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

所以问题是:可能存在一些设置告诉MVC不在路径中使用“Views”处理URL?

2 个答案:

答案 0 :(得分:3)

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

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

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

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

答案 1 :(得分:3)

以下是我的方式:

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

2-将静态页面添加到此新文件夹中,例如。 filename.cshtml

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

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" />

Resault: 现在,此文件夹中的任何文件都可以正常运行而无需路由!