Пользовательский VirtualPathProvider не может обслуживать URL-адреса, заканчивающиеся каталогом - PullRequest
2 голосов
/ 21 января 2010

Как часть CMS, я создал собственный VirtualPathProvider, который предназначен для обслуживания одного файла вместо фактической файловой структуры. Я настроил его так, что если файл действительно существует на сервере, этот файл будет обслуживаться. Если файл не существует, вместо него будет храниться виртуальный контент, сохраненный для этого адреса. Это похоже на концепцию обслуживания веб-сайта из файлов, хранящихся в базе данных, хотя в этом случае контент хранится в XML-файлах на сервере.

Эта настройка отлично работает, когда делается запрос к определенной странице. Например, если я запрашиваю «www.mysite.com/foobar.aspx», будет храниться контент, который хранится для «foobar.aspx». Кроме того, если я запрашиваю "www.mysite.com/subdir/foobar.aspx", будет также предоставлен соответствующий контент.

Проблема заключается в следующем: если я спрашиваю что-то вроде «www.mysite.com/foobar», вещи начинают разваливаться. Если каталог существует на диске (и не имеет настроенной страницы по умолчанию в IIS, такой как index.aspx), я получу сообщение об ошибке «Запрещено перечисление каталога». Если каталог не существует, я просто получу 404 - Ресурс не найден.

Я пробовал несколько вещей, и пока ничего из того, что я делал, не имело никакого значения. Кажется, что IIS просто отмечает отсутствие каталога (или файла по умолчанию в существующем каталоге) и обслуживает свой собственный код ошибки, даже не спрашивая мое приложение, что делать с запросом. Если он когда-нибудь попадет в приложение, я смогу решить проблему, но в настоящий момент я совершенно растерялся. Кто-нибудь знает, есть ли какая-то настройка в IIS, которая вызывает это?

Я искал каждый ресурс, который смог найти по этому предмету, и выхожу пустым. Я знаю, что это должно быть возможно, потому что я прочитал учебники по обслуживанию контента из баз данных и ZIP-файлов. ПОМОГИТЕ!

p.s., Я использую IIS6 и .NET 3.5

1 Ответ

2 голосов
/ 21 января 2010

IIS будет передавать запрос процессу ASP.NET, только если он настроен для конкретного расширения. По умолчанию используется aspx, ascx и т. Д. Другими словами, если вы запрашиваете файл .html, ASP.NET никогда не увидит этот HTTP-запрос. Аналогично для пустого расширения.

Чтобы изменить это поведение, добавьте сопоставление с подстановочными знаками в процесс ASP.NET. Загрузите IIS Manager, перейдите в Свойства для своего веб-сайта и посмотрите вкладку Домашний каталог. Нажмите «Конфигурация», и там вы увидите сопоставления расширения и приложения.

...