httphandler не работает с не домашними страницами

У меня есть приложение MVC2 и библиотека HttpHandler. Библиотека, для упрощения, служит изображением. Проблема в том, что если я вызываю этот обработчик с корневой страницы ( http://whatever/ ), все работает нормально. Однако если я изменю Global.asax, то та же страница теперь будет иметь адрес http://whatever/controller/action - не работает (выходит текст ALT вместо картинки).

Я не писал библиотеку обработчиков, но у меня есть код; поэтому я поставил точку останова в функции ProcessRequest реализации IHttpHandler. В хорошем случае точка останова срабатывает, а в плохом случае - нет. Итак, я предполагаю, что обработчик не вызывается для некорневых страниц.

Это то, что у меня есть в разделе system.webServer/handlers:

<add name="ImageHandler" verb="*" 
              path="ImageLib.axd" type="ImageHandler, ImageHandler" />

На странице просмотра есть

<img src="ImageLib.axd?image=img001.jpg" alt="real image here" />

Я не знаю, играет ли в этом какую-либо роль MVC... старое приложение WebForms отлично работает с теми же настройками.

Надеюсь, я предоставил все, что знаю. Конечно, если что-то будет непонятно, я с удовольствием объясню, как смогу!


person Felix    schedule 02.03.2010    source источник


Ответы (2)


Попробуй это:

<img src="/ImageLib.axd?image=img001.jpg" alt="real image here" />

Основная проблема заключается в том, что вы относительно ссылаетесь на ImageLib.axd. Браузер попытается получить к нему доступ, где бы он ни находился... в вашем случае, когда он запрашивает изображение, он запрашивает его из http://whatever/controller/action/ImageLib.axd. Я предполагаю, что вам нужно запросить у http://whatever/ImageLib.axd.

Обратите внимание, что простое добавление предыдущего удара (/) не обязательно решит вашу проблему. Если ImageLib.axd находится в какой-то подпапке вне вашего корня, вам нужно будет включить это. Если ваш обработчик ImageLib.axd находится в папке с именем handlers вне корня вашего веб-сайта, вы должны сделать следующее:

<img src="/Handlers/ImageLib.axd?image=img001.jpg" alt="real image here" />
person jrista    schedule 02.03.2010
comment
Хорошо, просто добавление предшествующей косой черты сработало. Насчет второй части не уверен - у меня нет физического Image.axd. Я думаю, что Image.axd сопоставлен с ImageHandler, который включен в ImageUtil.dll, который включен в качестве ссылки. Я думаю, это подразумевается в корне; поэтому косая черта решает проблему. Большое тебе спасибо! - person Felix; 02.03.2010
comment
Ах, да, не все обработчики .axd имеют реальный файл .axd... зависит от реализации. Рад, что решение сработало. :) - person jrista; 02.03.2010

Вам нужно направить запрос изображений на ваш httpHandler, но mvc перехватывает запросы и пытается направить их к действию контроллера.

Вы можете настроить это в своем Global.asax или если вы реализуете свое собственное HttpApplication в методе OnStart() следующим образом:

routes.IgnoreRoute("{*allaxd}", new {allaxd=@".*\.axd(/.*)?"});
// or make sure you have this 
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

Дополнительную информацию можно найти в сообщении Фила Хаака здесь http://haacked.com/archive/2008/07/14/make-routing-ignore-requests-for-a-file-extension.aspx

person Dax70    schedule 02.03.2010
comment
Dax70, спасибо за ваше предложение. У меня есть эта строка (думаю, она помещается в RegisterRoutes() при создании проекта MVC). Кроме того, я не уверен, как это предложение применимо к моей ситуации, поскольку я действительно вызываю обработчик http для корневых страниц. - person Felix; 02.03.2010