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

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

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

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

Ответы [ 2 ]

3 голосов
/ 28 августа 2013

Вот мой путь:

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

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

3 голосов
/ 31 мая 2011

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

...