Сопоставления файлов IIS7 - .asax, .ashx, .asap - PullRequest
4 голосов
/ 31 марта 2009



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?!

Ответы [ 4 ]

4 голосов
/ 31 марта 2009

Несколько баллов:

  • Файлы asmx не совпадают с файлами ascx. Вы используете их для веб-сервисов (мыло), а не для веб-контроля.
  • Ashx файлы не должны иметь для регистрации. Они в основном проще aspx, когда вам не нужен весь жизненный цикл страницы. Обычно используется для извлечения динамических изображений из базы данных.
  • Если бы хакер попытался сделать запрос на один из этих файлов, что бы вы хотели, чтобы произошло? Вы, конечно, не хотели бы, чтобы IIS рассматривал его как текстовый файл и отправлял исходный код вашего приложения в браузер.
  • То, что вы не ожидаете запросов от браузера на ресурс, не означает, что вы не хотите, чтобы этот ресурс обрабатывался механизмом asp.net. Эти расширения также позволяют ASP.Net собирать файлы для компиляции сайтов моделей веб-сайтов.
3 голосов
/ 31 марта 2009

а) и в) - насколько мне известно, они не подвергаются обработке каких-либо внешних запросов

b) по умолчанию он ищет файл .ashx с запрошенным путем / именем. Это позволяет легко добавить обработчик на веб-сайт без необходимости настройки.

Обновление: В a вы также упомянули asmx. Мое мнение - книга объясняет некоторые особенности, связанные с ajax, с некоторыми комментариями относительно:

  • Asp.net не позволяет делать запросы, направленные на .ascx.
  • Вы можете сделать запрос к веб-сервису (.asmx), чтобы получить информацию.
  • Существуют некоторые встроенные функции, которые помогут вам с вышеуказанным.
2 голосов
/ 01 апреля 2009

Чтобы точно устранить путаницу в том, что asp.net делает с этими запросами, проверьте файл web.config в:

%systemroot%\Microsoft.NET\Framework\v2.0.50727\CONFIG

Как вы можете видеть (опубликовано ниже), asp.net исключает практически любые файлы, в которых вы не уверены, получали ли они специальную обработку. Обратите внимание, что есть * .cs, * .acsx, * .asax.

<add path="*.asax" verb="*" type="System.Web.HttpForbiddenHandler" validate="True"/>
<add path="*.ascx" verb="*" type="System.Web.HttpForbiddenHandler" validate="True"/>
<add path="*.master" verb="*" type="System.Web.HttpForbiddenHandler" validate="True"/>
<add path="*.skin" verb="*" type="System.Web.HttpForbiddenHandler" validate="True"/>
<add path="*.browser" verb="*" type="System.Web.HttpForbiddenHandler" validate="True"/>
<add path="*.sitemap" verb="*" type="System.Web.HttpForbiddenHandler" validate="True"/>
<add path="*.dll.config" verb="GET,HEAD" type="System.Web.StaticFileHandler" validate="True"/>
<add path="*.exe.config" verb="GET,HEAD" type="System.Web.StaticFileHandler" validate="True"/>
<add path="*.config" verb="*" type="System.Web.HttpForbiddenHandler" validate="True"/>
<add path="*.cs" verb="*" type="System.Web.HttpForbiddenHandler" validate="True"/>
<add path="*.csproj" verb="*" type="System.Web.HttpForbiddenHandler" validate="True"/>
<add path="*.vb" verb="*" type="System.Web.HttpForbiddenHandler" validate="True"/>
<add path="*.vbproj" verb="*" type="System.Web.HttpForbiddenHandler" validate="True"/>
<add path="*.webinfo" verb="*" type="System.Web.HttpForbiddenHandler" validate="True"/>
<add path="*.licx" verb="*" type="System.Web.HttpForbiddenHandler" validate="True"/>
<add path="*.resx" verb="*" type="System.Web.HttpForbiddenHandler" validate="True"/>
<add path="*.resources" verb="*" type="System.Web.HttpForbiddenHandler" validate="True"/>
<add path="*.mdb" verb="*" type="System.Web.HttpForbiddenHandler" validate="True"/>
<add path="*.vjsproj" verb="*" type="System.Web.HttpForbiddenHandler" validate="True"/>
<add path="*.java" verb="*" type="System.Web.HttpForbiddenHandler" validate="True"/>
<add path="*.jsl" verb="*" type="System.Web.HttpForbiddenHandler" validate="True"/>
<add path="*.ldb" verb="*" type="System.Web.HttpForbiddenHandler" validate="True"/>
<add path="*.ad" verb="*" type="System.Web.HttpForbiddenHandler" validate="True"/>
<add path="*.dd" verb="*" type="System.Web.HttpForbiddenHandler" validate="True"/>
<add path="*.ldd" verb="*" type="System.Web.HttpForbiddenHandler" validate="True"/>
<add path="*.sd" verb="*" type="System.Web.HttpForbiddenHandler" validate="True"/>
<add path="*.cd" verb="*" type="System.Web.HttpForbiddenHandler" validate="True"/>
<add path="*.adprototype" verb="*" type="System.Web.HttpForbiddenHandler" validate="True"/>
<add path="*.lddprototype" verb="*" type="System.Web.HttpForbiddenHandler" validate="True"/>
<add path="*.sdm" verb="*" type="System.Web.HttpForbiddenHandler" validate="True"/>
<add path="*.sdmDocument" verb="*" type="System.Web.HttpForbiddenHandler" validate="True"/>
<add path="*.mdf" verb="*" type="System.Web.HttpForbiddenHandler" validate="True"/>
<add path="*.ldf" verb="*" type="System.Web.HttpForbiddenHandler" validate="True"/>
<add path="*.exclude" verb="*" type="System.Web.HttpForbiddenHandler" validate="True"/>
<add path="*.refresh" verb="*" type="System.Web.HttpForbiddenHandler" validate="True"/>

Также имейте в виду, что IIS может не быть настроен для сопоставления некоторых запросов (типов MIME) с конвейером ASP.NET.

2 голосов
/ 01 апреля 2009

a) .ascx не может быть доступен напрямую, потому что обработчиком по умолчанию является класс System.Web.HttpForbiddenHandler

<add path="*.ascx" verb="*" type="System.Web.HttpForbiddenHandler" validate="True" />

.asmx файлы могут быть вызваны напрямую, это веб-методы (хотя обычно вам нужно сделать POST-запрос, если вы не укажете, чтобы разрешить GET в web.config

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.

-

c) Global.asax: я не использую gloabl.asax, я скорее использую очень элегантное решение HttpModule, но, вероятно, оно настроено для устаревших сайтов с файлами global.asax.

...