2013-03-07 14 views
5

Ho scritto un httpHandler per un sito MV.NET di ASP.NET che genera un'immagine. La funzione ProcessRequest non viene chiamata. Qualche idea sul perché?perché il gestore http non è in esecuzione

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> 

utilizzo

<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

beh, grazie tmack per il collegamento che spiega cos'è un httphandler. Sfortunatamente non ha assolutamente nulla a che fare con la mia domanda. –

+0

yyyyyyep. nota a sé, smetti di schiumare. –

risposta

12

La risposta può essere trovata sul web se si sa cosa cercare.

Il motore di routing MVC tenta di mappare tutte le richieste a un controller, che in questo caso non è ciò che vogliamo. Oltre alla registrazione del gestore in Web.config, è necessario comunicare al motore di route MVC di ignorare httpHandler path in modo che il motore ASP.NET possa gestire il routing.

Ho scelto di utilizzare il example from Phil Haack

Per combattere collegamento rot questo è un estratto dell'articolo

Per impostazione predefinita, ASP.NET Routing ignora le richieste di file che non esiste su disco. Ho spiegato il motivo di questo in un precedente post su modifiche di routing imminenti. Per farla breve, non volevamo il routing al tentativo di instradare le richieste di file statici come le immagini. Sfortunatamente, questo ci ha causato un mal di testa quando abbiamo ricordato che molte delle funzionalità di ASP.NET fanno richieste per file .axd che non esistono sul disco .

Per risolvere questo problema, abbiamo inserito un nuovo metodo di estensione su RouteCollection, IgnoreRoute, che crea un percorso mappato al gestore percorso StopRoutingHandler (classe che implementa IRouteHandler). In effetti, qualsiasi richiesta che corrisponde a una "ignora route" verrà ignorata dal routing e la normale gestione di ASP.NET si verificherà in base ai mapping esistenti del gestore HTTP. Quindi nel nostro modello predefinito , noterai che abbiamo definito la seguente route.

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

Questo gestisce le richieste standard .axd . Tuttavia, vi sono altri casi in cui è possibile che richieda i file che non esistono sul disco. Ad esempio, se si registrare un gestore HTTP direttamente su un tipo che implementa IHttpHandler. Per non parlare delle richieste di favicon.ico che il browser effettua automaticamente. Il routing ASP.NET tenta di instradare queste richieste a un controller. Una soluzione a questo è aggiungere una route ignora appropriata per indicare che il routing deve ignorare queste richieste. Sfortunatamente, non possiamo fare qualcosa del genere:

{* percorso}.aspx/{*} pathinfo

Permettiamo solo un catch-all percorso e deve accadrà alla fine dell'URL. Tuttavia, è possibile adottare il seguente approccio . In questo esempio, ho aggiunto i seguenti due percorsi.

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

Quello che sto facendo qui è una tecnica Eilon mi ha mostrato che è quello di mappare tutti gli URL di questi percorsi, ma poi limitare i percorsi di ignorare tramite i vincoli del dizionario. Quindi in questo caso, queste rotte corrisponderanno (e quindi ignoreranno) a tutte le richieste di favicon.ico (non importa quale directory) e anche le richieste per un file .aspx. Poiché abbiamo detto al routing di ignorare queste richieste , si verificherà il normale elaborazione ASP.NET di queste richieste.

+0

Questo dovrebbe essere contrassegnato come la risposta. L'articolo conteneva questa correzione "Per impostazione predefinita, il routing ASP.NET ignora le richieste di file esistenti sul disco." –

0

La risposta precedente è corretta, ma l'articolo è stato modificato dall'estratto inserito qui. Le dichiarazioni ignorare dovrebbero leggere:

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

Annotare il '*' nel {* allaspx} e {*} favicon stringhe che manca in originale. Non riuscivo a farlo funzionare finché non ho seguito il collegamento e ho seguito l'esempio nell'articolo aggiornato.

+0

Frank, grazie per averlo indicato. Non c'era nessuna modifica all'articolo. Non l'ho preso, ma il renderizzatore di markdown SO pensava che i '* s nella citazione del blocco fossero formattati, non contenuti. Sono sfuggito ai simboli corretti e ora il contenuto della citazione del blocco deve corrispondere a quanto previsto, anche se ora il contenuto "effettivo" dietro la citazione del blocco è diverso da quello che viene reso ... se ciò ha senso. –