1

我在我的应用程序中使用 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 方法内放置一个断点,以查看错误何时在应用程序内执行

所以现在打开测试 URL: http://localhost/testmvc/test.css
我们可以看到 IIS 处理了这个错误: 在此处输入图像描述

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

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

4

2 回答 2

3

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

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

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

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

于 2011-05-31T18:09:31.477 回答
3

这是我的方式:

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

2-将您的静态页面添加到这个新文件夹中,例如。文件名.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" />

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

于 2013-08-28T13:34:01.767 回答