IIS позволяет нам также настраивать сопоставления файлов Asp.Net. Таким образом, помимо aspx, IIS также вызывает среду выполнения Asp.Net, когда запросы имеют следующие расширения файлов:
a) Расширение .ascx -> .asmx используется для запроса пользовательских элементов управления.
- Поскольку к пользовательским элементам управления нельзя получить прямой доступ, как и зачем кому-либо отправлять запрос в пользовательский элемент управления?
b) .ashx -> это расширение используется для обработчиков HTTP.
• Но зачем вам запрашивать страницу .ashx напрямую, а не регистрировать этот обработчик в файле конфигурации и разрешать его вызов при запросе файлов с определенными (не ashx) расширениями?
• Кроме того, поскольку может быть зарегистрировано несколько обработчиков Http, как Asp.Net узнает, какой обработчик вызывать, если все они используют расширение ashx?
• Что содержит запрошенный файл ashx? Возможно, определение класса обработчика Http?
• Я знаю, как мы регистрируем обработчики Http для вызова при запросе страниц, не относящихся к ashx, но как мы регистрируем обработчик Http для страницы ashx?
c) .asax -> Это расширение используется для запроса файла глобального приложения
• Почему мы хотим напрямую звонить в Global.asax?
• Я предполагаю, что, когда делается запрос для Global.asax, создается объект, производный от класса HTtpApplication, за исключением того времени, когда обработка веб-страницы не выполняется?
* 1030 спасибо *
В - Помимо того, что Asp.Net может запрашивать global.asax для компиляции, есть ли другая причина, почему я бы предпочел запросить файл с расширением .asax напрямую?
• Файлы ashx не должны быть зарегистрированы. Они в основном более простые aspx, когда вам не нужен весь жизненный цикл страницы. Обычно используется для извлечения динамических изображений из базы данных.
Итак, если я напишу обработчик Http, я должен поместить его в файл с расширением .ashx, и Asp.Net создаст объект HttpHandler аналогично тому, как он создает экземпляр страницы из файла .aspx?
• Если бы хакер попытался сделать запрос на один из этих файлов, что бы вы хотели случиться? Вы, конечно, не хотели бы, чтобы IIS рассматривал его как текстовый файл и отправлял исходный код приложения в браузер.
Asp.Net может делать то же самое, что и с типами файлов .cs, .csproj, .config, .resx, .licx, .webinfo. А именно, он регистрирует эти типы файлов в IIS, так что он может явно запретить пользователям доступ к этим файлам
• То, что вы не ожидаете запросов от браузера на ресурс, не означает, что вы не хотите, чтобы этот ресурс обрабатывался механизмом asp.net. Эти расширения также позволяют ASP.Net собирать файлы для компиляции сайтов моделей веб-сайтов.
Но тогда почему Asp.Net также не позволяет напрямую запрашивать файлы .cs, .csproj, .config, .resx, .licx, .webinfo?
а) и в) - насколько мне известно, они не подвергаются обработке каких-либо внешних запросов
моя книга утверждает, что они сопоставлены в IIS
Я ценю вашу помощь
EDIT:
b) Расширение .ashx определено в файле конфигурации, это просто не web.config, а в файле machine.config
<add path="*.ashx" verb="*" type="System.Web.UI.SimpleHandlerFactory" validate="True" />
http://msdn.microsoft.com/en-us/library/bya7fh0a.aspx
Зачем использовать .ashx: Разница в том, что класс .NET, который обрабатывает .ashx, читает директиву Page в файле .ashx, чтобы сопоставить запрос с классом, указанным в этой директиве. Это избавляет вас от необходимости указывать явный путь в web.config для каждого имеющегося у вас обработчика, что может привести к очень длинному web.config.
Я думал Http hкласс andler был определен внутри файла .ashx, но вместо этого файл с расширением .ashx содержит только директиву Page?
Так как я не уверен на 100%, правильно ли я понимаю: скажем, у нас есть десять обработчиков Http, которые мы хотим вызвать, отправив запрос в IIS7. Я предполагаю, что для каждого обработчика Http будет определенный файл .ashx -> таким образом, если запрос будет сделан для FirstHandler.asxh, то будет вызван обработчик, указанный внутри этого файла?
ЕЩЕ ДРУГОЕ РЕДАКТИРОВАНИЕ:
Я должен признаться, что я все еще немного не уверен насчет расширения Ashx.
Я понимаю, что, используя его, мы можем, например, создать страницу 'hey.ashx', где директива Page сообщит, какой класс (обработчик Http) вызывать, когда сделан запрос для 'hey.ashx' - поэтому нет необходимости регистрироваться Http обработчик в web.config.
Но если вы используете обработчики Http таким образом, то они будут вызываться только при запросах файлов с расширением .ashx. Таким образом, если я хочу, чтобы обработчик Http вызывался для файлов с другими расширениями, такими как .sourceC, тогда мне все равно нужно будет зарегистрировать обработчик Http в web.config?!