我正在查看在执行其中一个请求时调用Server.TransferRequest("Error.cshtml")
的ASP.NET MVC4应用程序,其中Foo.cshtml
是一个位于应用程序根文件夹中的视图页面。在我们的旧服务器上一切正常,但是一旦我将此应用程序部署到带有IIS8的新2012r2服务器,我将收到以下错误页面:
说明:您已请求的页面类型未被提供,因为它已被明确禁止。扩展程序' .cshtml'可能不正确。请查看下面的网址,确保拼写正确。
请求的网址: /Error.cshtml
为什么?如何让TransferRequest
工作?在新服务器上执行什么设置?要重现,您可以非常简单地创建一个新的ASP.NET MVC5项目,将Error.cshtml
razor页面添加到其文件夹,然后在Index
HomeController
HttpContext.Server.TransferRequest("Error.cshtml")
调用Application_Error
的操作中进行预览,你应该得到与上面相同的错误。
我在Global.Asax.cs
TransferRequest
方法中设置断点并预览应用后,我得到一个例外:
消息:路径' /WebApplication1/Error.cshtml'禁止。 在System.Web.HttpForbiddenHandler.ProcessRequest(HttpContext context) 在System.Web.HttpApplication.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() 在System.Web.HttpApplication.ExecuteStep(IExecutionStep step,Boolean& completedSynchronously)
此外,如果我部署新的ASP.NET MVC5测试应用程序调用{{1}}到我们的旧服务器(服务器2008),它仍然无法正常工作并抛出异常...所以它似乎都是旧服务器并且原始的ASP.NET MVC4应用程序以某种方式神奇地配置为使这个东西工作...
答案 0 :(得分:0)
请检查.cshtml
是否在旧服务器中列为应用程序上下文的MIME类型。如果是这种情况,那么您可以(在推荐中)add .cshtml
as a MIME type在应用程序的上下文中。您可以在更高级别添加MIME类型,例如站点或服务器,并且您的应用程序的上下文应继承它但不建议使用,除非您需要在多个应用程序之间共享定义。
<强>声明强>
让用户直接访问.cshtml
并不是最佳做法。如果Error.cshtml
旨在作为静态内容提供,那么您应该重命名它并将其重写为HTML。如果将.cshtml
设置为允许的MIME类型,则可能允许用户检查Web应用程序中的每个.cshtml
文件。
或者,您可以编写控制器来提供所需的内容,例如:
public ActionResult CustomError()
{
return View("Error");
}
....
HttpContext.Server.TransferRequest("CustomError")
虽然我建议使用Exception Filters
答案 1 :(得分:0)
默认情况下,新的MVC 5应用程序生成一个web.config文件,其中包含以下行:
Root web.config文件
<configuration>
<appSettings>
<add key="webpages:Version" value="3.0.0.0" />
<add key="webpages:Enabled" value="false" />
<add key="ClientValidationEnabled" value="true" />
<add key="UnobtrusiveJavaScriptEnabled" value="true" />
</appSettings>
查看文件夹web.config
<appSettings>
<add key="webpages:Enabled" value="false" />
</appSettings>
当webpages:Enabled
设置为false时,应用程序会阻止直接呈现.cshtml
和.vbhtml
文件。将此值更改为true
,保存并重新编译。您的应用程序现在应该呈现这些文件。
答案 2 :(得分:0)
最后问题的根本原因是相当愚蠢的......是的,你必须在webpages:Enabled
中将true
设置为web.config
,但这是MVC4中的默认值无论如何。但是,不同之处在于网址:
所以差异必须在路由的某个地方,我不会进一步调查,因为它埋没在HttpServerUtility.TransferRequest
中。这两个请求都在HttpContext.Server.TransferRequest("Error.cshtml")
断点处,但结果不同。