Обработчики HTTP в классическом режиме IIS6 или IIS7

#iis-6 #httphandler

#iis-6 #httphandler

Вопрос:

В настоящее время я борюсь с httphandlers в IIS. Я разрабатываю веб-сайт в .NET4 в VS2010 и Cassini. На этом веб-сайте у меня есть галерея, изображения которой загружаются через мой обработчик. Например http://mywebsite.com/Gallery/123/Pic1.jpg Мой HTTP-обработчик получает идентификатор 123 и возвращает изображение из базы данных (упрощенный).

Итак, все отлично работает в Cassini (против встроенного веб-сервера) и в IIS7 в «интегрированном режиме». Изображения загружаются так, как должны.

Но я должен развернуть этот сайт на общем хостере, который использует IIS6.

После многих поисков и собственного ведения журнала я обнаружил, что запрос не перенаправляется моему обработчику, и поэтому я получаю 404 от IIS.

Мое определение, которого достаточно для интегрированного режима IIS7:

 <system.web>
   <handlers>
       <add verb="*" path="Gallery/*/*" type="[coorect Type spec]" />
   </handlers>
</system.web>
  

Для IIS7 в классическом режиме мне пришлось добавить

 <system.webServer>
    <handlers>
        <add name="ImageHandler" verb="*" path="Galler</*/*" type="[type]" modules="IsapiModule" scriptProcessor="c:windowsMicrosoft.netframeworkv4.0.30319aspnet_isapi.dll"/>
    </handlers
</system.webServer>
  

Эта последняя конфигурация работает только с данными в атрибутах module и scriptprocessor…

Но эта конфигурация не работает в IIS6….

Кто-нибудь может мне помочь?

Ответ №1:

Проблема в том, что IIS6 обычно решает, какому обработчику ISAPI передать запрос, используя расширение файла. Таким образом, он видит .jpg и пытается обслуживать статический файл по этому пути. Это также то, что IIS7 называет классическим режимом. И вы заметите, что ссылаетесь aspnet_isapi.dll в вашей конфигурации, потому что ему нужно указать, что должно с этим справиться. После того, как вы передали его в aspnet_isapi, asp.net запускается конвейер обработки http, и вы можете выполнить свой обработчик.

Самым простым решением было бы найти хост, поддерживающий IIS7. В противном случае вы можете увидеть, есть ли у них какие-либо параметры перезаписи URL. При этом вы можете переписать вещи так, чтобы добавить .ashx к URL-адресу, что позволит IIS6 захватить его и поместить в asp.net конвейер, и ваш обработчик сработает. Вы также можете посмотреть, разрешают ли они сопоставления с подстановочными знаками, но это очень сложная задача для большинства общих хостов.