2013-06-02 5 views
13

sto usando MVC4 e hanno bisogno di instradare una richiesta del genere a un controller:Invio di un URL con estensione nella MVC4 non funzionerà, cerca di servire file statico

[myapp]/data/fileinfo.xml

Ecco il percorso ho configurato:

routes.MapRoute(
      name: "Data", 
      url: "Data/{file}", 
      defaults: new { controller = "Data", action = "fileinfo"} 
     ); 

Ora, questo funziona perfettamente bene e instrada le richieste alla mia DataController se l'URL non include l'estensione .xml, ma non appena l'estensione viene utilizzata, IIS tenta di servire un file statico (invece di routing al mio controller) e ottengo un errore 404.

Ho letto un sacco di domande/risposte su questo problema online e ogni soluzione che ho provato ha fallito.

Ad esempio, ho provato a utilizzare RouteExistingFiles = true durante la configurazione di RouteCollection e ho aggiunto <modules runAllManagedModulesForAllRequests="true" /> in web.config, ma senza alcun risultato.

Se qualcuno ha un'idea di cosa dovrei provare o cosa potrei mancare, sarebbe molto apprezzato. Sto usando asp.Net 4.5, VS 2012 e IIS 8.0.

risposta

10

È possibile aggiungere questo al vostro web.config nella sezione <system.webServer><handlers>:

<add name="ManagedDllExtension" 
    path="data/fileinfo.xml" 
    verb="GET" type="System.Web.Handlers.TransferRequestHandler" 
    preCondition="integratedMode,runtimeVersionv4.0" /> 

Il percorso sarebbe

routes.MapRoute(
     name: "Data", 
     url: "Data/fileinfo.xml", 
     defaults: new { controller = "Data", action = "fileinfo"} 
    ); 

C'è anche <modules runAllManagedModulesForAllRequests="true"> ma non sembra funzionare per MVC4/IIS8 (usato per essere corretto in MVC3/IIS7 IIRC). Maggiori informazioni here. C'è anche un impatto sulle prestazioni con questo dato che ogni richiesta verrà instradata attraverso la pipeline gestita.

HTH

+1

Grazie per la vostra risposta, lo apprezzo molto. :) Dopo aver provato questo, finisco per ottenere un errore 500 quando si va all'URL. Il messaggio di errore dice che probabilmente IIS ha ricevuto la richiesta e poi ha fallito in qualche modo con il modulo che ha gestito la richiesta (i dettagli dell'errore fanno riferimento a ManagedDllExtension e al modulo ManagedPipelineHandler, ma è un po 'troppo vago per essere utile a me). – user2445698

+0

Nel frattempo, ho trovato una soluzione possibile (potrebbe non essere carina, ma funziona). Sto catturando /data/fileinfo.xml in Global.asax.cs e usando Context.RewritePath() per tagliare l'estensione. Quindi il routing è in grado di funzionare correttamente. Grazie ancora per il vostro aiuto. – user2445698

+0

Ah è un peccato - ha funzionato perfettamente sulla mia macchina :-). Sono felice di sentire che hai una soluzione. Puoi sempre refactoring in un secondo momento! –

0

Ho avuto lo stesso problema con ASP MVC 4. Nella sezione web.config syste.webserver.handlers ho trovato il codice successivo:

<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" /> 

Tutte le richieste che sono .ext sarà gestito automaticamente da IIS. Quelli mancavano in MVC 3.

+0

Come suggerisce il nome, tutti gli URL senza estensioni verranno gestiti da questo, mentre la domanda sembra essere più di URL con estensione.Inoltre, questi due gestori funzionano in modo specifico quando il pool di applicazioni IIS viene eseguito in modalità classica. –

Problemi correlati