Это из-за карт сценариев для ASP.NET. Только некоторые расширения отображаются в ASP.NET. Остальные обрабатываются непосредственно IIS. Это сделано по соображениям производительности.
Есть два способа справиться с этим.
Дублируйте ваши правила авторизации в файлах web.config в списках ACL файлов NTFS (то есть устанавливайте разрешения для папок и файлов напрямую). Убедитесь, что схема аутентификации пользователя соответствует учетным записям и группам, используемым для управления доступом ... другими словами, если вы используете SQL для хранения токенов имени пользователя, это не сработает, потому что эти токены не обязательно будут привязаны к пользователи домена и группы / роли.
Создайте IHttpHandler для обслуживания файлов, не относящихся к ASP.NET. Из метода ProcessRequest
вызовите метод Server.MapPath(url)
для входящего URL-адреса, а затем выполните потоковую передачу файла, используя Response.WriteFile(filename)
. Возможно, вам сначала потребуется установить свойство ContentType. И (вот плохие новости), вам все равно может потребоваться выполнить декларативную или обязательную проверку доступа - просто наличие записей в файлах web.config может не работать. См. Пользовательская обработка ASP.NET с HTTP для получения дополнительной информации о написании собственного обработчика. Вероятно, это хорошая идея - создавать отдельные обработчики для каждого типа контента. Как только вы напишите один, вы увидите, как легко их сделать.
Вы можете попробовать (сам не пробовал) добавить элементы в файлы web.config, где у вас есть дополнительные элементы - используйте элемент , чтобы удалить унаследовал HttpHandler и добавил еще один на уровне подпапок (возможно, указывая на тот же класс?). Я не уверен, что это сработает, но стоит попробовать.
Наконец, если вы действительно не хотите проходить и выполнять всю эту работу, вы можете просто добавить дополнительные сопоставления расширений в IIS. Например, посмотрите на Как: зарегистрировать обработчики HTTP , вы можете добавить сопоставление для файлов .jpg в aspnet_isapi.dll (взгляните на существующие сопоставления для .aspx и т. Д.). Вам не нужно добавлять элемент HttpHandler в ваш web.config, потому что web.config уровня машины уже содержит эту запись:
<add path="*" verb="GET,HEAD,POST" type="System.Web.DefaultHttpHandler" validate="true"/>
Обратите внимание, что на вашем сайте могут возникнуть серьезные проблемы с производительностью.