2013-03-07 4 views
5

Я написал httpHandler для сайта ASP.NET MVC4, который генерирует изображение. Функция ProcessRequest не вызывается. Любые мысли о том, почему?Почему httphandler не работает

MVC4, IIS Express, Windows 8 Pro

Web.config> system.webServer

<system.webServer> 
    <validation validateIntegratedModeConfiguration="false" /> 
    <handlers> 
     <remove name="TextImage" /> 
     <remove name="ExtensionlessUrlHandler-ISAPI-4.0_32bit" /> 
     <remove name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" /> 
     <remove name="ExtensionlessUrlHandler-Integrated-4.0" /> 
     <add name="ExtensionlessUrlHandler-ISAPI-4.0_32bit" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness32" responseBufferLimit="0" /> 
     <add name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness64" responseBufferLimit="0" /> 
     <add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" /> 
     <add name="TextImage" path="textimage/*.png" verb="*" resourceType="Unspecified" type="MultiStepUI.TextImageHandler, MultiStepUI_MOBETTER" /> 
    </handlers> 
    </system.webServer> 

использование

<img src="/textimage/step1.png?q=Step 1&c=404040&w=30&h=250&z=12" /> 
+0

http://forums.asp.net/post/3416052.aspx –

+0

ну, спасибо, tmack за эту ссылку, объясняющую, что такое httphandler. К сожалению, это не имеет никакого отношения к моему вопросу. –

+0

yyyyyyep. обратите внимание на себя, прекратите скимминг. –

ответ

12

Ответ можно найти на веб-сайте если кто-то знает, что искать.

Механизм маршрутизации MVC пытается сопоставить все запросы с контроллером - это не то, что мы хотим в этом случае. В дополнение к регистрации обработчика в Web.config нам нужно сообщить движку маршрута MVC игнорировать httpHandler path, чтобы механизм ASP.NET мог обрабатывать его маршрутизацию.

Я решил использовать example from Phil Haack

Для борьбы ссылки гнили это отрывок из статьи

По умолчанию ASP.NET Routing игнорирует запросы на файлы, которые не есть на диске. Я объяснил причину этого в предыдущем сообщении на предстоящих изменениях маршрутизации. Короче говоря, нам не нужна маршрутизация в попытки маршрутизации запросов на статические файлы, такие как изображения. К сожалению, это вызвало у нас головную боль, когда мы вспомнили, что многие функции ASP.NET делают запросы на .axd-файлы, которые не существуют на диске .

Чтобы исправить это, мы включили новый метод расширения RouteCollection, IgnoreRoute, что создает маршрут, проложенный в обработчик маршрута StopRoutingHandler (класс, который реализует IRouteHandler). Фактически любой запрос, который соответствует «игнорировать маршрут », будет проигнорирован путем маршрутизации, и нормальная обработка ASP.NET будет произойти на основе существующих сопоставлений HTTP-обработчиков. Следовательно, в нашем шаблоне по умолчанию вы заметите, что мы определили следующий маршрут.

routes.IgnoreRoute ("{resource} .axd/{* pathInfo}");

Эта инструкция обрабатывает стандартных .axd-запросов. Однако есть и другие случаи, когда вы можете иметь запросы на файлы, которые не существуют на диске. Например, если вы зарегистрируете обработчик HTTP непосредственно для типа, реализующего IHttpHandler. Не говоря уже о запросах на favicon.ico, что браузер делает автоматически. ASP.NET Маршрутизация пытается перенаправить эти запросы на контроллер. Одним из решений этого является добавление соответствующего пути игнорирования , чтобы указать, что маршрутизация должна игнорировать эти запросы. К сожалению, мы не можем сделать что-то вроде этого:

{* путь}.aspx/{* pathinfo}

Мы разрешаем только один маршрут, и он должен произойти в конце URL-адреса. Тем не менее, вы можете принять следующий подход . В этом примере я добавил следующие два маршрута.

routes.IgnoreRoute ("{* allaspx}", новый {allaspx = @ ". * \. Aspx (/.*)?"});
routes.IgnoreRoute ("{* favicon}", новый {favicon = @ "(. * /)? Favicon.ico (/.*)?"});

Что я здесь делаю это техника Eilon показал мне, что на карте все адреса на этих маршрутах, но ограничить, какие маршруты игнорировать с помощью ограничений словаря. Таким образом, в этом случае эти маршруты будут соответствовать (и таким образом игнорировать) все запросы для favicon.ico (независимо от того, в какой директории), а также запросов на файл .aspx. Поскольку мы сказали, что маршрутизация игнорирует эти запросы , будет выполняться обычная обработка этих запросов ASP.NET.

+0

Это должно быть отмечено как ответ. В статье была исправлена ​​«По умолчанию ASP.NET Routing игнорирует запросы на файлы, которые существуют на диске». –

0

Предыдущий ответ верный, но статья отредактирована из выдержки, размещенной здесь. Высказывания игнорирующие следует читать:

routes.IgnoreRoute("{*allaspx}", new {[email protected]".*\.aspx(/.*)?"}); 
routes.IgnoreRoute("{*favicon}", new {[email protected]"(.*/)?favicon.ico(/.*)?"}); 

Обратите внимание на '*' в {* allaspx} и {*} FavIcon строки, которые отсутствуют в оригинале. Я не мог заставить его работать, пока не перешел по ссылке и не последовал примеру обновленной статьи.

+0

Фрэнк, спасибо, что указали это. В статью не было прав. Я не поймал его, но рендерер сметы SO считал, что '*' s в цитате блока форматируются, а не контент. Я избежал правильных символов, и теперь содержимое цитаты блока должно соответствовать тому, что было предназначено, - хотя теперь «фактическое» содержимое за кадром блока отличается от того, что отображается ... если это имеет смысл. –