2013-01-11 11 views
7

In MVC 3 non ho avuto un problema, ma ora sono andato su MVC 4.Il routing di ASP.NET MVC 4 non funziona quando l'ID ha un'estensione di file

L'URL si presentava così:

{controller}/{action}/{id} 

/podcast/file/PODCAST-01.MP4 

Dove il podcast-01.MP4 è l'id; quando colpisce il controller, il controller invia il file al client, è stato fatto in questo modo in modo da poter facilmente contare quante persone hanno scaricato il file.

Tuttavia, ora, il server Web, pensa che ci dovrebbe essere un file lì e dà un errore 404. Ho cercato di aggirare questo facendo la mia pagina di errore 404 e poi reindirizzare indietro con /podcast/file?id=PODCAST-01.MP4 ma questo non funziona perché a iTunes non piace, non gli piace il "?".

Ho cercato di creare un una nuova rotta:

routes.MapRoute(
      name: "Default", 
      url: "{controller}/{action}/{id}.{format}", 
      defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional, format = UrlParameter.Optional }); 

Ma che sembra aver appena rotto il routing. Qualsiasi aiuto sarebbe grande.

+2

Quando si dice si rompe l'instradamento, che cosa succede? Sembra corretto a colpo d'occhio. – Billdr

+0

Ottengo questo errore quando vado a qualsiasi pagina: "Errore HTTP 403.14 - Proibito Il server Web è configurato per non elencare il contenuto di questa directory." quando cambio RouteConfig.cs –

+0

Come su come aggiungere una sezione 'constraints' che definisce esplicitamente cosa dovrebbe avere un nome file (e non avere)? (C'è anche, storicamente, problemi con [parametri facoltativi consecutivi] (http://haacked.com/archive/2011/02/20/routing-regression-with-two-consecutive-optional-url-parameters.aspx)) –

risposta

5

È possibile farlo. In MVC 4 soluzione web di configurazione contiene:

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

È sufficiente aggiungere prima di quelli di un nuovo gestore per il percorso

<add name="ManagedFileWithExtension" path="podcast/file*" verb="GET" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" /> 
1

Non è possibile farlo (credo) È necessario riposare il suffisso nel codice analizzando la richiesta.

Problemi correlati