2013-06-02 9 views
13

Używam MVC4 i trzeba trasie żądania takiego do kontrolera:Routing url z rozszerzeniem w MVC4 nie będzie działać, stara się służyć do pliku statycznego

[myapp]/data/fileinfo.xml

Oto trasa mam skonfigurowane:

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

teraz to działa perfekcyjnie i szlaki wnioski do mojego DataController jeżeli URL nie zawiera rozszerzenie .xml, ale tak szybko, jak to rozszerzenie jest używana, IIS próbuje służyć plik statyczny (zamiast routingu do kontrolera) i pojawia się błąd 404.

Przeczytałem mnóstwo pytań/odpowiedzi na temat tego problemu w Internecie, a każde rozwiązanie, które wypróbowałem, zawiodło.

Na przykład próbowałem używać RouteExistingFiles = true podczas konfigurowania mojej kolekcji RouteCollection i dodałem <modules runAllManagedModulesForAllRequests="true" /> w web.config, ale bez skutku.

Jeśli ktoś ma pomysł na to, co powinienem wypróbować lub czego może mi brakować, byłoby to bardzo cenne. Korzystam z programów asp.Net 4.5, VS 2012 i IIS 8.0.

Odpowiedz

10

Możesz dodać to do pliku web.config w sekcji <system.webServer><handlers>:

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

Trasa będzie

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

Istnieje również <modules runAllManagedModulesForAllRequests="true"> ale nie wydają się działać dla MVC4/IIS8 (kiedyś było dobrze w MVC3/IIS7 IIRC). Więcej informacji: here. Występuje tu również wpływ na wydajność, ponieważ każde żądanie przechodzi przez zarządzany potok.

HTH

+1

Dziękuję za odpowiedź, naprawdę to doceniam. :) Po wypróbowaniu tego, otrzymuję błąd 500 podczas przechodzenia do adresu URL. Komunikat o błędzie informuje, że IIS prawdopodobnie odebrał żądanie, a następnie w jakiś sposób nie działał z modułem, który obsługiwał żądanie (szczegóły dotyczące błędów odwołują się do ManagedDllExtension i modułu ManagedPipelineHandler, ale jest to zbyt mało precyzyjne, aby być dla mnie pomocnym). – user2445698

+0

W międzyczasie znalazłem możliwe obejście (może nie być ładne, ale działa). Przechwytywam plik /data/fileinfo.xml w pliku Global.asax.cs i za pomocą metody Context.RewritePath() przycinam rozszerzenie. Wtedy routing może działać poprawnie. Jeszcze raz dziękuję za pomoc. – user2445698

+0

Ach, szkoda - zadziałało idealnie na mojej maszynie :-). Cieszę się, że masz obejście. Zawsze możesz refactor w późniejszym terminie! –

0

miałem ten sam problem z ASP MVC 4. W sekcji web.config syste.webserver.handlers znalazłem kolejny kod:

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

wszystkie żądania, które mają .ext będzie obsługiwane automatycznie przez IIS. Tych brakowało w MVC 3.

+0

Jak sama nazwa wskazuje, wszystkie bez rozszerzenia adresów URL będą obsługiwane przez to, podczas gdy pytanie wydaje się być więcej adresów URL z rozszerzeniem.Ponadto te dwie procedury obsługi będą działać szczególnie wtedy, gdy puli aplikacji IIS działa w trybie klasycznym. –

Powiązane problemy