Вызовите 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.

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