Вызовите ASP.NET MVC Controller при запросе файла.html
Мне нужно добавить новую жизнь в устаревшее приложение:)
Я хотел бы вызвать контроллер MVC, когда запрашивается "статическая" HTML-страница, чтобы добавить некоторую разметку на страницу перед возвратом ее клиенту.
Я пытался следовать подходу, найденному в этой теме: Как прочитать настройки web.config на странице.html?
... но хотя я определил этот маршрут:
routes.MapRoute(
name: "Topic",
url: "html/{fileName}.html",
defaults: new { controller = "Topic", action = "Index" });
контроллер не вызывается. Мой web.config определен с помощью:
<remove name="WebServiceHandlerFactory-Integrated" />
<add name="HTML" path="*.html" verb="*"
type="System.Web.UI.PageHandlerFactory"
resourceType="File" preCondition="integratedMode" />
Я подозреваю, что мне нужно вызвать что-то еще, кроме PageHandlerFactory, или, возможно, проблема в чем-то совершенно ином.
ОБНОВЛЕНИЕ: Моя среда разработки работает в режиме интегрированного конвейера, но мне нужно проверить, будет ли моя производственная среда поддерживать его.
2 ответа
Если вы делаете это:
routes.RouteExistingFiles = true;
Вы должны найти это работает - даже без добавления обработчика. В контроллере вы можете загрузить HTML напрямую, используя HostingEnvironment.VirtualPathProvider
"s GetFile
метод и сделать что-то с ним - или, что еще лучше, просто использовать обычное представление MVC, которое отображает тот же контент, что и статический файл, только с вашими дополнениями.
Хотя имейте в виду, что это означает, что любые файлы, которые могут быть перехвачены какими-либо маршрутами, будут помещены в конвейер MVC. Это, как правило, не является проблемой, если используется приличное разделение маршрутов и физических путей.
Я настроил ту же ситуацию, что и вы, и она хорошо сработала для меня, поэтому у вас есть ключевые компоненты на месте. Некоторые вещи, которые следует учитывать при тестировании и устранении неисправностей:
Вашему web.config нужен поставщик сборки для расширения html:
<system.web>
<compilation>
<buildProviders>
<add extension=".html"
type="System.Web.Compilation.PageBuildProvider" />
</buildProviders>
</compilation>
</system.web>
Копирование и вставка ваших обработчиков работает для меня, так что это выглядит хорошо.
И копирование и вставка вашего MapRoute также работает для меня, хотя я использовал контроллер Home по умолчанию в чистом проекте. Так что в качестве двойной проверки просто подтвердите, что у вас есть контроллер с именем Topic с методом ActionResult с именем Index().
И убедитесь, что ваш URL-адрес localhost.com: enjportcasts/html/test.html с путем / html / в пути, поскольку ваше правило запрашивает это.
Другим хорошим тестом является изменение вашего MapRoute для использования aspx вместо этого и тестирование страницы aspx и посмотреть, работает ли это. Это подтвердит, являются ли это сопоставления IIS или правила MVC. Если он работает с aspx, то проблема связана с обработчиком, но если он не работает с aspx, то это что-то с MVC.
Также подтвердите, что вы используете IIS Express, а не Cassini. Кассини не справится с этим правильно, но IIS Express справится. Вы можете подтвердить это, щелкнув правой кнопкой мыши на своем проекте, и вы должны увидеть пункт меню под названием "Использовать Visual Studio Development Studio...". Это будет существовать, только если вы в настоящее время используете IIS Express.