Веб-приложение ASP.NET MVC не может найти ссылку href - PullRequest
0 голосов
/ 02 мая 2018

В моем веб-приложении Azure есть следующий HTML-код:

Please complete and return the 
<a href="~/Views/MyView/TermsOfService.pdf">Terms of Service</a>

Файл .csproj содержит этот файл PDF:

Когда я нажимаю «Запустить Google Chrome» для локального тестирования в Visual Studio и нажимаю «Условия обслуживания», я получаю следующую ошибку:

enter image description here

Но файл есть! Это в моей файловой системе. Там нет необходимости кодирования. Почему отображается эта ошибка и почему невозможно загрузить PDF из веб-приложения? Нужен ли мне еще один шаг, чтобы опубликовать его? Пожалуйста, помогите!

1 Ответ

0 голосов
/ 02 мая 2018

По умолчанию содержимое папок Views не должно быть доступно нормальному конвейеру запросов. Папка Views содержит домашние файлы просмотра (.cshtml), которые будут выполняться механизмом просмотра. Если вы посмотрите на файл web.config, расположенный внутри ~/Views, то увидите, что у нас зарегистрировано BlockViewHandler, которое запрещает прямой доступ ко всем файлам.

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

Вам следует рассмотреть возможность перемещения вашего pdf-файла в каталог Statics в корне приложения и указать на него.

enter image description here

Теперь, укажите на это место

<a href="~/Statics/TermsOfService.pdf">Terms of Service</a>

Вы можете указать собственное имя для каталога. Некоторые люди любят хранить его в каталоге Content. Так что это скорее личное предпочтение.

В ядре asp.net каталог wwwroot по умолчанию является домашним статическим содержимым. Таким образом, вы можете хранить внутри себя статическое содержимое (это можно переопределить)

Вы можете внести изменения в файл web.config, расположенный в каталоге views, чтобы разрешить прямой просмотр, но более надежный подход состоит в том, чтобы не загрязнять соглашение и перемещать статические ресурсы в его собственную папку. Если вы абсолютно хотите разрешить прямой доступ к файлам в каталог представлений, вы можете обновить значение атрибута path, чтобы сообщить mvc о запрете доступа только к файлам с определенным расширением. Вот как вы будете предотвращать только .cshtml файлы (поэтому pdf будет работать)

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