2013-01-11 10 views
7

In MVC 3 hatte ich kein Problem, aber jetzt habe ich zu MVC 4 Ich mache.ASP.NET MVC 4 Routing funktioniert nicht, wenn die ID eine Dateierweiterung hat

Die URL sah wie folgt aus:

{controller}/{action}/{id} 

/podcast/file/PODCAST-01.MP4 

Wo die PODCAST-01.MP4 ist die ID; Wenn es den Controller trifft, würde der Controller die Datei dann an den Client senden, so dass wir leicht zählen können, wie viele Leute die Datei heruntergeladen haben.

Allerdings denkt der Webserver, dass dort eine Datei sein sollte und gibt einen 404 Fehler. Ich habe versucht, dies zu umgehen, indem ich meine eigene 404-Fehlerseite mache und dann mit /podcast/file?id=PODCAST-01.MP4 zurückleite, aber das funktioniert nicht, weil iTunes es nicht mag, es mag es nicht das "?".

Ich habe versucht, eine neue Route zu erstellen:

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

Aber das scheint das Routing nur gebrochen zu haben. Jede Hilfe wäre großartig.

+2

Wenn Sie sagen, es bricht das Routing muss hinzufügen, was passiert? Es sieht auf den ersten Blick korrekt aus. – Billdr

+0

Ich erhalte diesen Fehler, wenn ich auf eine Seite gehe: "HTTP Error 403.14 - Forbidden Der Webserver ist so konfiguriert, dass er den Inhalt dieses Verzeichnisses nicht auflistet." wenn ich die RouteConfig.cs ändere –

+0

Wie wäre es mit dem Hinzufügen eines "Constraints" Abschnitt, der explizit definiert, was ein Dateiname haben sollte (und nicht haben)? (Es gab in der Vergangenheit auch Probleme mit [aufeinanderfolgenden optionalen Parametern] (http://haacked.com/archive/2011/02/20/routing-regression-with-two-consecutive-optional-url-parameters.aspx)) –

Antwort

5

Sie können das tun. In MVC 4-Lösung Web-config enthält:

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

Sie einfach vor den für Sie Pfad einen neuen Handler

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

Sie können das nicht tun (denke ich) Sie müssen das Suffix in Ihrem Code ausruhen und die Anfrage analysieren.