Как вы запрашиваете статические файлы .html в папке ~ / Views в ASP.NET MVC?

92

Я хочу иметь возможность запрашивать статические .htmlфайлы, которые находятся в ~/Viewsпапке. Согласно документации, система маршрутизации проверяет, соответствует ли URL-адрес файлу на диске, прежде чем оценивать маршруты приложения.

Но когда я запрашиваю файл, 404возникает ошибка.

Мой файл находится в папке ~ / Views. URL-адрес:http://[localhost]/Views/HtmlPage1.html

Что я пропустил?

алексей миронов
источник

Ответы:

111

Я хочу иметь возможность запрашивать статические файлы .html, которые находятся в папке ~ / Views.

Вы не можете. В этой папке есть файл web.config, который явно запрещает доступ к любому файлу из него. Если вы хотите иметь доступ к файлам с клиента, эти файлы не следует помещать в Viewsпапку, которая имеет особое значение в ASP.NET MVC.

У вас может быть ~/Staticпапка, в которой вы можете разместить свои HTML-файлы. А затем получить к нему доступ так:

http://example.com/yourapplicationname/static/foo.html
Дарин Димитров
источник
4
Или, вместо того, чтобы называть свою папку «статической», вы можете имитировать структуру имен контроллера, которая находится внутри папки «Представления» .., чтобы URL-адрес имел такой же «внешний вид». Например, поскольку вы не можете поместить свой plainjane Edit.html в Views / Order / Edit.html - вы помещаете его в ~ / Order / Edit.html
bkwdesign
2
Теперь это изменилось в последней версии ASP.NET (vNext), где вы можете зарегистрировать статический поставщик для html-файлов, но при этом по-прежнему выполнять маршрутизацию обычным способом MVC. Только быстро поигрался с ним, но именно это я сделал с тестовым проектом. Запуск через пустельгу в Linux .. но я полагаю, что IIS должен быть таким же.
Петр Кула
1
@bkwdesign Я уверен, что его конфигурация, управляемая путем имитации структуры папок, испортила обработчик по умолчанию моего контроллера и сделала его недоступным. Так что проверьте эту ситуацию.
Hunter-Orionnoir
78

Чтобы разрешить файлы вроде js и html в папке Views, отредактируйте файл web.config в папке views-Folder:

<system.webServer>
<handlers>
  <add name="JavaScriptHandler" path="*.js" verb="*"
     preCondition="integratedMode" type="System.Web.StaticFileHandler" />      
  <add name="HtmlScriptHandler" path="*.html" verb="*"
     preCondition="integratedMode" type="System.Web.StaticFileHandler" />
  <remove name="BlockViewHandler"/>
  <add name="BlockViewHandler" path="*" verb="*" preCondition="integratedMode" type="System.Web.HttpNotFoundHandler" />
</handlers>

cs3x
источник
1
Пришлось удалить строчку «routes.RouteExistingFiles = true;» в RouteConfig.RegisterRoutes, чтобы это работало
Сэм Сиппе
Хотя отмеченный ответ содержит полезную информацию, это лучший ответ. Протестировано и работает в моем текущем проекте.
A. Murray
1
А как насчет файлов css?
Леандро
Ответ @Darin Dimitrov дает обходной путь, но он должен быть отмечен как ответ
Kunal
31

Я хочу иметь возможность запрашивать статические файлы .html, которые находятся в папке ~ / Views.

Ну ты можешь. Отмеченный ответ не совсем правильный, хотя и дает решение.

Обоснование в отмеченном ответе правильное, это web.config (точнее, параметр BlockViewHandler) в папке Views, который предотвращает прямой доступ к файлам. Он нужен для защиты представлений в Asp.Net MVC. Но если вы задали вопрос об обслуживании этих файлов напрямую, то у вас, вероятно, есть веская причина для этого, например, использование частичных представлений AngularJS (как в нашем случае), где мы не хотим дублировать папку представлений со странными именами.

Итак, вот очень простая настройка, которую вы можете сделать в файле web.config, находящемся в папке Views, без ущерба для безопасности ваших mvc-представлений asp.net. Это защитит файлы .cshtml, как обычно, но оставит ваши файлы .html в покое.

Изменить это

<add name="BlockViewHandler" path="*" verb="*" preCondition="integratedMode"    type="System.Web.HttpNotFoundHandler" />

--to--

<add name="BlockViewHandler" path="*.cshtml" verb="*" preCondition="integratedMode" type="System.Web.HttpNotFoundHandler" />
Викас
источник
3
Это может быть опасно для других файлов, таких как файлы .aspx или .ascx, или файлов из сторонних механизмов просмотра. Гораздо лучше внести в белый список в соответствии с ответом cs3x.
pwdst 04
1
@pwdst: если вы используете смесь представлений на стороне сервера, тогда да, добавление отдельных типов в белый список может быть лучше. Мы просто хотим защитить файлы .cshtml, поэтому мы использовали его, поскольку он немного менее подробный.
Викас
14

Другой альтернативный вариант - вставить метод действия в любой из желаемых контроллеров для обслуживания файла html.

public ActionResult MyHtml()
{
    var result = new FilePathResult("~/Views/HtmlPage1.html", "text/html");
    return result;
}

Получите доступ к html как http: // yoursite / controller / MyHtml . Вы можете расширить этот метод действия, чтобы принять имя файла HTML как параметр метода / запроса и отобразить файл во время выполнения, например, что-то вроде этого.

 public ActionResult MyHtml(string htmlPageName)
 {
      var result = new FilePathResult($"~/Views/{htmlPageName}.html", "text/html");
      return result;
 }
Венкатеш Муниянди
источник
0

Если вы планируете использовать внутреннюю папку просмотра, ответы выше должны быть лучшими, но этот ответ может быть полезен для пользователей, которые переходят на ядро ​​asp.net mvc. Размещение файлов в wwwroot вместо папки просмотров должно облегчить доступ к вашим html-страницам как localhost / myfile.html

Куркула
источник