2010-10-13 18 views
9

Gibt es eine Möglichkeit, den Zugriff (404) auf die Razor Ansichten in MVC 3 Beta 1 zu blockieren? Wenn ich eine brandneue leere Website (IIS7) erstellen und darauf zugreifen dann /views/home/index.cshtml aus dem Browser anstelle der 404 bekomme ich dieseASP.NET MVC 3 Beta 1 Block Zugriff auf Razor Ansichten

[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 

die Datei web.config in den Ansichten der Standardeinstellung Der Ordner ist so eingestellt, dass alle Dateianfragen blockiert werden, aber offensichtlich geht diese Anfrage immer noch durch.

Schritte zum Reproduzieren:
Datei -> Neues Projekt
ASP.NET MVC 3 Web Application
Internet Application (Razor)
F5
Navigieren Sie zu /views/home/index.cshtml

+0

Können Sie den vollständigen Stack-Trace bereitstellen? – marcind

+0

Aktualisiert mit voller Stack-Trace und Schritten zum Reproduzieren. – bkaid

+0

Danke, ich kann bestätigen, dass dies ein gültiger Fehler ist. – marcind

Antwort

9

Ich bin ein Entwickler Vorsprung auf dem ASP.NET-Team arbeitet an sowohl ASP.NET MVC 3 und ASP.NET Webseiten und Razor.

Dies ist nicht vollständig in ASP.NET MVC 3 RC behoben, aber es wird vollständig in ASP.NET MVC 3 RTM behoben werden.

Es gibt nichts „furchtbar schlecht“, die in ASP.NET MVC 3 RC oder früher geschieht: Das Schlimmste, was passieren kann, ist, dass jemand erkennen kann, ob eine Ansicht, in der App vorhanden ist - aber sie nicht bekommen, um sie auszuführen (aufgrund dieser seltsamen Ausnahme). Dies ist ein geringfügiges Sicherheitsproblem, da es sich um eine Form der Offenlegung von Informationen handelt, aber es ist kein sehr schwerwiegendes Problem.

In ASP.NET MVC 3 RTM sind alle Razor-Ansichten in ~/Ansichten/... sowie alle Razor-Ansichten innerhalb eines MVC-Bereichs zu 100% blockiert und können nicht direkt vom Browser ausgeführt werden. Sie können nur als MVC-Ansichtsseiten ausgeführt werden.

4

Sie könnten wahrscheinlich in web.config eine Art von Rewrite-Regeln verwenden, um den Benutzer von der direkt verknüpften .cshtml-Datei zur eigentlichen Aktion umzuleiten oder sie einfach auf eine 404-Seite umzuleiten/neu zu schreiben.

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

Update: Eine komplexere Version für Marius Schulz (die Sie sich diese auch harte thekaido wasa gestimmt nur für 404s zu fragen). Dies wird eine URL wie views/home/index.cshtml?key=value nehmen und es an home/index?key=value umleiten. Es ist eine 301-Weiterleitung, aber es kann auch ein Rewrite oder ein anderer HTTP-Statuscode sein - more here

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

Natürlich ist dies ohne den Query-String funktioniert (der ?key=value Teil). Der einzige Nachteil davon ist, dass web.config über Ihre registrierten Routen nicht bekannt ist (normalerweise in Global.asax.cs). Und meines Wissens gibt es jetzt so, wie es geht. Dafür müssen Sie einen benutzerdefinierten Code schreiben. Betrachten Sie this article von Phil Haack und den Quellcode, der dazu gehört.

(Und bitte nicht nach unten Abstimmung, nur weil es nicht Ihre Bedürfnisse paßt, auch wenn ich eine andere Person der Frage bin zu beantworten.)

+0

Das löst das Problem nicht - ich möchte diese nicht ignorieren oder 404 Fehlerseiten anzeigen, sondern sie anzeigen ... –

+0

thekiados Frage war etwa 404s. Ihre Abstimmung war also unfair. Ich füge eine komplexere Version hinzu, die tatsächlich versucht, den Controller zu bekommen und ihn zu betrachten. – gligoran

3

Für jene von MVC3 RC in RTM migriert, stellen Sie sicher, dass Sie die \ Ansichten \ web.config schauen, und fügen Sie den folgenden Konfigurations

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

Dies ist wird sicher alle View-Dateien (* machen. cshtml) return 404 nicht gefunden.

+0

Das war hilfreich, danke. – chrisortman

Verwandte Themen