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: теперь любой файл в этой папке будет работать без маршрутизации!