如何将TransferRequest转换为cshtml文件?

时间:2018-01-05 16:38:20

标签: c# asp.net .net asp.net-mvc razor

我正在查看在执行其中一个请求时调用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应用程序以某种方式神奇地配置为使这个东西工作...

3 个答案:

答案 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中的默认值无论如何。但是,不同之处在于网址:

  • localhost / WebApp 导致有关cshtml网页被禁止的错误
  • localhost / WebApp / 渲染得很好

所以差异必须在路由的某个地方,我不会进一步调查,因为它埋没在HttpServerUtility.TransferRequest中。这两个请求都在HttpContext.Server.TransferRequest("Error.cshtml")断点处,但结果不同。