ОШИБКА: управляемые запросы IIS7

(Я не знаю, следует ли мне также публиковать этот вопрос в ServerFault, поскольку он касается конфигурации IIS?)

В IIS7 мы можем указать модулю запускаться для управляемого содержимого (тем самым ускоряя обслуживание статического содержимого) с помощью:

<modules>
    ...
    <add name="WhateverName"
         type="WhateverType"
         preCondition="managedHandler"
    ...
</modules>

Но. Это отлично работает, пока в запрошенном URL есть имя файла (с расширением). Если он не указан, IIS7 подумает, что вам нужен статический контент, а управляемые модули работать не будут.

http://localhost/ <-- this one will skip managed handlers
http://localhost/default.aspx <-- this one will run them

Если я вручную установил документ IIS7 по умолчанию, поэтому первым будет default.aspx, Я не вижу разницы, разницы нет. Для меня это выглядит, ходит и звучит как ошибка. И это ошибка! Почему? Потому что, когда я запрашиваю первый, это управляемый запрос, не так ли. Конечно, это является. Но IIS7 рассматривает его как статический запрос. Так? Это ошибка. Этот запрос следует рассматривать как управляемый.

Как мне убедить IIS7 запускать управляемые обработчики для URL-запросов без имен файлов внутри?

Помогите с мышлением

Позвольте мне немного помочь вам подумать: если бы я переупорядочил system.webServer/handlers, я уверен, что смогу решить эту проблему. Перед последним обработчиком StaticFile, который указывает на StaticFileModule, DefaultDocumentModule и DirectoryBrowsingModule, я должен запустить интегрированный обработчик asp.net для запросов Каталога. Или напишите свой собственный обработчик, который будет добавлять документ по умолчанию к любому запросу каталога. Я почти уверен, что один из них должен решить эту проблему. Но как мне его настроить / разработать?


person Robert Koritnik    schedule 12.08.2009    source источник
comment
Что вы имеете в виду, говоря, что я не вижу разницы? Работает ли при указании дефолта или нет?   -  person Jeff Hardy    schedule 12.08.2009
comment
без разницы, меняю ли я настройки документа по умолчанию или нет.   -  person Robert Koritnik    schedule 13.08.2009


Ответы (3)


Проблема в порядке обработки запросов. IIS7 обрабатывает запросы в порядке, указанном элементом конфигурации обработчиков IIS. По умолчанию элемент Handlers конфигурации IIS содержит

<add name="StaticFile" path="*" verb="*" modules="StaticFileModule,DefaultDocumentModule,DirectoryListingModule" resourceType="Either" requireAccess="Read" />

в конце обработчиков. Следовательно, все запросы, не соответствующие какому-либо ранее указанному обработчику, будут обрабатываться этим обработчиком (включая запрос папки).

Вы можете удалить все обработчики по умолчанию с помощью элемента clear в конфигурации обработчиков и указать собственный порядок обработки запросов.

Я рекомендую скопировать конфигурацию обработчиков IIS по умолчанию (C: \ Windows \ System32 \ inetsrv \ config \ applicationHost.config) в вашу веб-конфигурацию без обработчика StaticFile в конце.

Затем вы должны добавить специальный обработчик статического содержимого для каждого типа статического содержимого (jpg, gif, js, css).

<add name="StaticFile-swf" path="*.swf" verb="*" modules="StaticFileModule" resourceType="File" requireAccess="Read" />
<add name="StaticFile-png" path="*.png" verb="*" modules="StaticFileModule" resourceType="File" requireAccess="Read" />
<add name="StaticFile-gif" path="*.gif" verb="*" modules="StaticFileModule" resourceType="File" requireAccess="Read" />
<add name="StaticFile-jpg" path="*.jpg" verb="*" modules="StaticFileModule" resourceType="File" requireAccess="Read" />
<add name="StaticFile-css" path="*.css" verb="*" modules="StaticFileModule" resourceType="File" requireAccess="Read" />
<add name="StaticFile-js" path="*.js" verb="*" modules="StaticFileModule" resourceType="File" requireAccess="Read" />

и управляемый обработчик (PageHandlerFactory) для запросов папки после этого.

<add name="PageHandlerFactory-Folders" path="*" verb="*" type="System.Web.UI.PageHandlerFactory" modules="ManagedPipelineHandler" resourceType="Unspecified" requireAccess="Read" allowPathInfo="false" preCondition="integratedMode" />

В конце вы также должны добавить обработчик StaticFile.

Вот пример.

person Peter Starbek    schedule 25.08.2009

Удаление preCondition="managedHandler" или добавление <modules runAllManagedModulesForAllRequests="true"> должно сделать это. Раздел "Предварительные условия" в на этой странице есть дополнительная информация.

person Jeff Hardy    schedule 12.08.2009
comment
Есть причина использовать preCondition = managedHandler, поскольку он ускоряет доставку статического контента. Это ПЛОХО ПЛОХО ПЛОХО обходной путь, а не решение. Я удалил эту настройку в первую очередь. - person Robert Koritnik; 12.08.2009
comment
Я думал, что вы хотите, чтобы он работал со статическим содержимым, но вижу, что неправильно понял ваш вопрос. Если вы храните свой статический контент в отдельном каталоге, поместите туда файл web.config, который удаляет рассматриваемый модуль. Я обычно использую ‹clear /› и просто вставляю модули, которые мне нужны для статического содержимого. - person Jeff Hardy; 12.08.2009
comment
Что, если содержимое вашей папки смешано? - person Robert Koritnik; 12.08.2009
comment
По этой причине я предпочитаю хранить статический контент отдельно. Я знаю, что не очень помогает :). - person Jeff Hardy; 12.08.2009

Вы можете использовать wild отображение сценария карты, но использовать управляемый обработчик для обработки всех запросов неэффективно. Статический обработчик намного эффективнее, когда он уместен.

person JP Alioto    schedule 12.08.2009