Asp.net mvc ASP.NET MVC 3 Beta 1阻止对Razor视图的访问

Asp.net mvc ASP.NET MVC 3 Beta 1阻止对Razor视图的访问,asp.net-mvc,asp.net-mvc-3,Asp.net Mvc,Asp.net Mvc 3,在MVC3Beta1中有没有办法阻止对Razor视图的访问(404)?当我创建一个全新的空白站点(IIS7),然后从浏览器访问/views/home/index.cshtml,而不是404时,我得到了这个结果 [InvalidCastException: Unable to cast object of type 'ASP.Index_cshtml' to type 'System.Web.IHttpHandler'.] System.Web.WebPages.WebPageHtt

在MVC3Beta1中有没有办法阻止对Razor视图的访问(404)?当我创建一个全新的空白站点(IIS7),然后从浏览器访问/views/home/index.cshtml,而不是404时,我得到了这个结果

    [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
默认情况下,views文件夹中的web.config文件设置为阻止所有文件请求,但显然该请求仍在通过

复制步骤:
文件->新项目
ASP.NET MVC 3 Web应用程序
互联网应用程序(Razor)
F5

导航到/views/home/index.cshtml

您可能可以使用web.config中的某种重写规则将用户从直接链接的.cshtml重定向到实际操作,或者只是将其重定向/重写到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>
当然,这在没有查询字符串(key=value部分)的情况下有效。唯一的缺点是web.config不知道您注册的路由(通常在Global.asax.cs中)。而且,据我所知,现在有办法了。为此,您必须编写一些自定义代码。请看Phil Haack的文章及其附带的源代码


(请不要因为它不符合您的需要而否决投票,即使我正在回答其他人的问题。)

我是ASP.NET团队的开发负责人,负责ASP.NET MVC 3和ASP.NET网页和Razor

这在ASP.NET MVC 3 RC中不是完全固定的,但在ASP.NET MVC 3 RTM中会完全固定

在ASP.NET MVC 3 RC或更早版本中,没有什么“非常糟糕”的事情发生:最糟糕的情况是有人可以检测到你的应用程序中是否存在视图,但他们无法让它运行(由于那个奇怪的异常)。这是一个轻微的安全问题,因为这是一种信息披露形式,但不是一个非常严重的问题


在ASP.NET MVC 3 RTM中~/views/…中的所有Razor视图。。。以及MVC区域内的任何Razor视图都是100%阻止的,浏览器无法直接运行。它们只能作为MVC视图页运行。

对于那些从MVC3 RC迁移到RTM的页面,请确保查看\views\web.config,并添加以下配置

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


这将确保所有视图文件(*.cshtml)返回404未找到。

您能提供完整堆栈跟踪吗?更新了完整堆栈跟踪和复制步骤。谢谢,我可以确认这是一个有效的错误。如果您忽略global.asax中的路由,会发生什么?IgnoreRoute(“{resource}.cshtml/{*pathInfo}”);我已经试过了,但没有任何改变。这并不能解决问题——我不想忽略这些或显示404错误页面,而是显示它们……thekiado的问题是关于404的。所以你的反对票是不公平的。我将添加一个更复杂的版本,实际处理试图从中获取控制器和视图的操作。
  <appSettings>
    <add key="webpages:Enabled" value="false" />
  </appSettings>