Подтвердить что ты не робот

Почему файлы CSS и JS обходят маршруты Asp.Net MVC?

Я получил прототип приложения, созданного с помощью Asp.Net MVC4. В настоящее время он заменяет контроллер по умолчанию factory на пользовательский, используя NInject, ServiceLocator и все.

Проблема заключается в том, что, заменив контроллер по умолчанию factory, запросы к файлам JS обрабатываются так, как если бы это был законный запрос для контроллера и действия.

Итак, глядя на шаблон по умолчанию, созданный Visual Studio, настройка маршрута выглядит так:

public static void RegisterRoutes(RouteCollection routes)
{
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

    routes.MapRoute(
        name: "Default",
        url: "{controller}/{action}/{id}",
        defaults: new { controller = "Home", action = "Index", id =   UrlParameter.Optional }
    );
}

Посмотрев, я спрашиваю себя: почему запрос на "/Scripts/jquery.js" не интерпретируется Asp.Net MVC? Я имею в виду, почему он не думает, что "Script" - это контроллер, а "jquery.js" - это действие?

Поскольку проект работает, если я отключу переопределение контроллера factory, я могу только предположить, что по умолчанию для этого типа проверки отвечает factory по умолчанию. И это означало бы, что "/Scripts/jquery.js" действительно передается контроллеру factory, чего я действительно не знал.

Может ли кто-нибудь пролить свет на это?

Какое лечение следует делать при переопределении контроллера factory, чтобы избежать таких проблем?

4b9b3361

Ответ 1

После немного более исследований я нашел следующую цитату из книги Стивена Сандерсона:

Тем не менее, система маршрутизации по-прежнему проверяет файловую систему, чтобы убедиться, что входящий URL-адрес соответствует файлу или диску, и если это так, маршрутизация игнорирует запрос (минуя любые записи маршрута, которые могут также совпадать с URL-адресом), чтобы файл будет обслуживаться напрямую. Это очень удобно для статических файлов, таких как изображения, CSS и файлы JavaScript. Вы можете сохранить их в своем проекте (например, в папках /Content или/ Script), а затем ссылаться и обслуживать их напрямую, точно так же, как если бы вы вообще не использовали маршрутизацию. Поскольку файл действительно существует на диске, он имеет приоритет над конфигурацией маршрутизации.

Если вместо этого вы хотите, чтобы ваша конфигурация маршрутизации имела приоритет над файлами на диске, вы можете установить для свойства RouteCollections RouteExistingFiles значение true. (По умолчанию оно ложно.)

Это было что-то очень интересное для изучения и привело меня к реальной проблеме. Гораздо проще. Так получилось, что в папке нет соответствующих сценариев. По крайней мере, не те, которые указаны в той же версии, что и в представлении. Это было ответственным за Asp.Net MVC, считая, что это запрос контроллера/действия.

Ссылка: http://forums.asp.net/t/1536510.aspx/1

Ответ 2

Это не из-за того, как MVC обрабатывает запрос jquery.js из-за того, как IIS обрабатывает запрос jquery.js. IIS предполагает, что такие ресурсы, как .js,.jpg и т.д., Являются статическими ресурсами и, следовательно, не нужно передавать их через механизм ASP.NET. Чтобы это не произошло, вы можете добавить строку в web.config для пути, который вы хотите оставить IIS.

<system.webserver>
    <handlers>
    <add name="scripts" path="/Scripts/*" verb="GET" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0"/>
    </handlers>
</system.webserver>

Добавление чего-то подобного должно позволить вашим JS файлам обслуживаться через ASP.NET, а не напрямую через IIS.