2010-10-13 16 views
9

Czy istnieje sposób blokowania dostępu (404) do widoków Razor w MVC 3 beta 1? Kiedy tworzę nową pustą stronę (IIS7), a następnie uzyskać dostęp /views/home/index.cshtml z przeglądarki zamiast 404 otrzymuję tenASP.NET MVC 3 Beta 1 Blokuj dostęp do widoków Razor

[InvalidCastException: Unable to cast object of type 'ASP.Index_cshtml' to type 'System.Web.IHttpHandler'.] 
    System.Web.WebPages.WebPageHttpHandler.CreateFromVirtualPath(String virtualPath, VirtualPathFactoryManager virtualPathFactoryManager) +56 
    System.Web.WebPages.WebPageRoute.DoPostResolveRequestCache(HttpContextBase context) +253 
    System.Web.WebPages.WebPageHttpModule.OnApplicationPostResolveRequestCache(Object sender, EventArgs e) +89 
    System.Web.SyncEventExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +148 
    System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +75 

Domyślnie plik web.config w widokach Folder jest ustawiony tak, aby blokować wszystkie żądania plików, ale oczywiście żądanie to jest nadal realizowane.

Kroki do odtworzenia:
File -> New Project
ASP.NET MVC 3 Web Application
Internet Application (Razor)
F5
Przejdź do /views/home/index.cshtml

+0

Czy możesz podać pełny ślad stosu? – marcind

+0

Zaktualizowano z pełnym śladem stosu i krokami do odtworzenia. – bkaid

+0

Dzięki, mogę potwierdzić, że jest to prawidłowy błąd. – marcind

Odpowiedz

9

Jestem ołowiu dev na zespół pracuje nad ASP.NET zarówno ASP.NET MVC 3 i ASP.NET Web Pages i Razor.

Nie jest to całkowicie poprawione w ASP.NET MVC 3 RC, ale zostanie całkowicie naprawione w ASP.NET MVC 3 RTM.

Nie

ma nic „strasznie zły”, co dzieje się w ASP.NET MVC 3 RC lub wcześniej: Najgorsze, co może się zdarzyć, że ktoś może wykryć, czy istnieje pogląd w swojej aplikacji - ale nie można go uruchomić (z powodu tego dziwnego wyjątku). Jest to niewielka kwestia bezpieczeństwa, ponieważ jest to forma ujawnienia informacji, ale nie jest to bardzo poważny problem.

W ASP.NET MVC 3 RTM wszystkie widoki Razor w ~/Widoki/... jak również wszystkie widoki Żyletki w obszarze MVC są w 100% zablokowane i nie będą bezpośrednio uruchamiane przez przeglądarkę. Będą one działać tylko jako strony widoku MVC.

4

Prawdopodobnie możesz użyć jakiejś reguły przepisywania w web.config, aby przekierować użytkownika z bezpośrednio połączonego pliku .cshtml do rzeczywistej akcji lub po prostu przekierować/przepisać ją na stronę 404.

<system.webServer> 
    <rewrite> 
     <rules> 
      <rule name="rule1" patternSyntax="Wildcard" stopProcessing="true"> 
       <match url="*.cshtml" /> 
       <action type="Redirect" url="http://www.example.com/some404.html" /> 
      </rule> 
     </rules> 
    </rewrite> 
</system.webServer> 

Aktualizacja: Bardziej skomplikowana wersja Marius Schulz (który głosował w dół to nawet trudne thekaido Wasa prosząc tylko o błędy 404). Spowoduje to pobranie adresu URL takiego jak views/home/index.cshtml?key=value i przekierowanie go na numer home/index?key=value. To jest przekierowanie 301, ale może być również Przepisz lub jakiś inny kod stanu HTTP - more here

<rule name="cshtml" stopProcessing="true"> 
    <match url="^views/([^/]+)/([^.]+)\.(?:cshtml|aspx)" /> 
    <action type="Redirect" url="{R:1}/{R:2}" /> 
</rule> 

Oczywiście to działa bez łańcucha zapytania (The ?key=value części). Jedyną wadą tego jest to, że web.config nie wie o twoich zarejestrowanych trasach (zwykle w Global.asax.cs). I według mojej wiedzy, jest to teraz możliwe. W tym celu będziesz musiał napisać niestandardowy kod. Spójrz na this article Phila Haacka i kod źródłowy, który się z nim zgadza.

(I proszę nie głosować nie w dół tylko dlatego, że nie pasuje do Twoich potrzeb, nawet jeśli mam odpowiedzi na pytanie innej osoby).

+0

To nie rozwiązuje problemu - nie chcę tego ignorować ani wyświetlać stron błędu 404, ale wyświetlać je ... –

+0

Pytanie thekiado było około 404s. więc twoje głosowanie w dół było niesprawiedliwe. Dodam bardziej złożoną wersję, która faktycznie obsługuje próby uzyskania kontrolera i obejrzenia go. – gligoran

3

Dla tych migracji z RC do RTM MVC3, upewnij się, spojrzeć w \ views \ web.config i dodać następujące config

<appSettings> 
    <add key="webpages:Enabled" value="false" /> 
    </appSettings> 

Jest to zadba o wszystkie widoku pliki (*. cshtml) return 404 not found.

+0

To było pomocne, dzięki. – chrisortman