2013-03-07 13 views
5

Napisałem httpHandler dla strony ASP.NET MVC4, która generuje obraz. Funkcja ProcessRequest nie jest wywoływana. Wszelkie przemyślenia na temat tego, dlaczego?dlaczego httphandler nie działa

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> 

Wykorzystanie

<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

cóż, dziękuję za ten link, wyjaśniając, czym jest httphandler. Niestety nie ma to absolutnie nic wspólnego z moim pytaniem. –

+0

rrrrrrr. Uwaga dla siebie, przestań szperać. –

Odpowiedz

12

Odpowiedź można znaleźć w internecie jeśli ktoś wie, czego szukać.

Silnik trasowania MVC próbuje zmapować wszystkie żądania do kontrolera - czego nie chcemy w tym przypadku. Oprócz rejestracji programu obsługi w pliku Web.config musimy poinformować silnik trasy MVC, aby zignorował znak httpHandler path, aby silnik ASP.NET mógł obsłużyć jego trasę.

zdecydowałem się użyć example from Phil Haack

celu zwalczania martwy link ten jest fragmentem artykułu

Domyślnie ASP.NET Routing ignoruje prośby o pliki, które nie istnieje na dysku. Wyjaśniłem przyczynę tego w poprzednim poście na nadchodzących zmianach routingu . Krótko mówiąc, nie chcieliśmy kierować do próbować trasować żądania dla plików statycznych, takich jak obrazy. Niestety, spowodowało to ból głowy, gdy przypomnieliśmy sobie, że wiele funkcji ASP.NET generuje żądania plików .axd, które nie istnieją na dysku .

Aby rozwiązać ten problem, mamy włączone nową metodę rozszerzenia na RouteCollection, IgnoreRoute, która tworzy trasę mapowane do obsługi trasy StopRoutingHandler (klasy, która implementuje IRouteHandler). W efekcie każde żądanie pasujące do "ignore route" zostanie zignorowane przez routing, a normalna obsługa ASP.NET będzie miała wartość w oparciu o istniejące mapowania procedury obsługi protokołu http. Stąd w naszym domyślnym szablonie zauważysz, że zdefiniowaliśmy następującą trasę.

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

Obsługuje standardowe żądania .axd . Istnieją jednak inne przypadki, w których można uzyskać żądań dla plików, które nie istnieją na dysku. Na przykład, jeśli użytkownik zarejestruje procedurę obsługi HTTP bezpośrednio w typie implementującym IHttpHandler. Nie wspominając o prośbach o favicon.ico, które przeglądarka automatycznie tworzy. Program ASP.NET Routing próbuje przekierować te żądania do kontrolera . Jednym z rozwiązań jest dodanie odpowiedniej trasy ignorowania, aby wskazać, że ruting powinien zignorować te żądania. Niestety, nie możemy zrobić czegoś takiego:

{* ścieżka}.aspx/{* pathinfo}

Zezwalamy tylko na jedną trasę catch-all i musi ona być na końcu adresu URL. Możesz jednak zastosować następujące podejście: . W tym przykładzie dodałem następujące dwie trasy.

routes.IgnoreRoute ("{* allaspx}", nowy {allaspx = @ ". * \. Aspx (/.*)?"});
routes.IgnoreRoute ("{* favicon}", nowy {favicon = @ "(. * /)? Favicon.ico (/.*)?"});

Co robię tutaj jest technika Eilon pokazał mi co jest odwzorować wszystkie adresy na tych trasach, ale wtedy ograniczyć które trasy ignorować poprzez ograniczeń słownika. Tak więc w tym przypadku te trasy będą pasować (i tym samym zignorować) wszystkie żądania dotyczące favicon.ico (bez względu na to, który katalog), a także żądania dla pliku .aspx. Ponieważ powiedzieliśmy routingowi, aby zignorować te żądania, nastąpi normalne przetwarzanie tych żądań przez ASP.NET.

+0

To powinno być oznaczone jako odpowiedź. Artykuł zawiera tę poprawkę "Domyślnie program ASP.NET Routing ignoruje żądania plików istniejących na dysku." –

0

Poprzednia odpowiedź jest poprawna, ale artykuł został zredagowany z zamieszczonego tutaj fragmentu. Sprawozdania ignorują powinien brzmieć:

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

Zanotować '*' w {* allaspx} i {*} favicon struny że brakuje w oryginale. Nie mogłem go uruchomić, dopóki nie podążyłem za odnośnikiem i poszedłem za przykładem w zaktualizowanym artykule.

+0

Frank, dziękuję za wskazanie tego. W artykule nie było żadnych zmian. Nie złapałem go, ale renderer klasyfikacji SO pomyślał, że '*' w bloku cytowania formatują, a nie treść. Uciekłem od właściwych symboli, a teraz zawartość cytatu z bloku powinna pasować do zamierzonego - nawet jeśli teraz "rzeczywista" treść kryjąca się za cytatem blokowym różni się od tego, co jest renderowane ... jeśli to ma jakiś sens. –