ASP.NET MVC IgnoreRoute метод не работает правильно, когда URL начинается с "/Views/"

Я использую 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 обработал эту ошибку:

Теперь мы открываем еще один тестовый URL с "/Views/..." по пути: http://localhost/testmvc/Views/test.css
И мы видим, что ошибка была обработана ASP.NET:

Таким образом, вопрос заключается в следующем: может быть, существует какая-то настройка, которая указывает MVC не обрабатывать URL с "представлениями" в пути?

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

Вот мой путь:

1- Создайте новую папку в папке Views, например. моя папка

2- Добавьте вашу статическую страницу в эту новую папку, например. filename.cshtml

3- Скопируйте файл web.config из папки "Views" и вставьте его в новую папку, которую вы только что создали (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: теперь любой файл в этой папке будет работать без маршрутизации!

Другие вопросы по тегам