#c# #asp.net #staticfilehandler
#c# #asp.net #staticfilehandler
Вопрос:
У меня есть ASP.NET веб-проект, который (помимо прочего) обслуживает некоторые статические файлы. По умолчанию платформа предполагает, что все пути к файлам относятся к местоположению веб-проекта. Однако я бы хотел, чтобы фактический корень загружался из пользовательских настроек в Web.config (например "C:MyStaticFiles"
).
Есть ли какой-либо способ изменить то, что StaticFileHandler
считается корневым каталогом сервера? Если нет, есть ли простой способ реализовать IHttpHandler
, который внесет это изменение и передаст остальную часть работы обычному StaticFileHandler
?
Ответ №1:
По соображениям производительности лучше использовать перезапись URL, а не связываться с HttpHandler. StaticFileHandler работает не так быстро, как IIS. Ваш собственный обработчик будет в 10 раз медленнее, чем StaticFileHandler, и, если вы не очень, очень хороший инженер, он, вероятно, приведет к утечке (или неправильной загрузке) памяти.
Вы можете вызвать контекст.Перепишите путь в событии BeginRequest (или PostAuthorizeEvent, если вы используете авторизацию URL) вашего HttpModule или HttpApplication, чтобы выполнить перезапись для выбранных типов файлов.
Комментарии:
1. Как я могу использовать перезапись URL-адреса, чтобы изменить корневую папку, из которой отправляются файлы? Эта папка находится за пределами папки веб-проекта.
context.RewritePath
все еще принимает виртуальный путь — он выдает ошибку, если вы пытаетесь указать ему абсолютный путь. Есть ли что-то подобное, что позволило бы мне изменить абсолютный физический путь?2. Нет, вы должны настроить виртуальную папку IIS на физический путь, а затем использовать RewritePath, чтобы указать IIS там. Извините, я забыл упомянуть об этом.
Ответ №2:
Я думаю, что из соображений производительности не рекомендуется создавать другое сопоставление путей для статических ресурсов. Они могут обслуживаться IIS напрямую без каких-либо ASP.NET обработка, если они находятся в папке веб-сайта.