【问题标题】:IIS returns 404 for ASP.NET MVC3 file (.cshtml)IIS 为 ASP.NET MVC3 文件 (.cshtml) 返回 404
【发布时间】:2011-09-09 20:11:04
【问题描述】:

我有标准的 ASP.NET 4 应用程序。在这个应用程序内部也有一些剃刀(例如test.cshtml)文件。但是,如果我将浏览器指向 /test 文件(不带扩展名),则 ASP.NET 应用程序可以工作。 IIS(静态文件处理程序)返回 404。

相同的应用程序甚至独立的.cshtml 文件都可以在本地机器(使用 IIS7.5/Win7)和使用(IIS7.5/Win2008R2)的服务器上运行,但是它不能在使用 IIS7.0 的服务器上运行/Win2008.

两台机器上都安装了 MVC3,两台机器上的应用程序池都集成了 .NET 4.0。

.cshtml 处理程序如何工作? IIS 何时决定使用静态文件处理程序以及.cshtml 处理程序何时?我还应该检查什么?

编辑:

澄清 - 我实际上并没有使用整个 MVC 框架,它就像普通的 .ASPX 或 PHP 文件一样。没有控制器,没有路线,没有“视图”。除了旧的 ASP.NET 应用程序之外,我还将它用于一个简单的脚本。

我认为这不是编程问题,因为它可以在本地计算机上运行,​​而是配置问题 - Win2008 服务器上的 IIS 可能配置不正确。

EDIT2:

(IIS7.5的机器可以,只有IIS7.0的机器不行。但是不知道是不是IIS版本的问题。)

EDIT3:

在我工作的本地计算机上,我没有设置任何路由。 TheCodeKing 和 Keith 建议我需要在某个地方设置路由。也许是的,但它不在我的应用程序中。它可能在 IIS 配置中默认设置。

您是否有任何提示可以找到这种“隐式”路由?

EDIT4:

注意:在所有计算机上,*.cshtml 都有 HttpForbiddenHandler,因为您无法下载 cshtml 文件。还有TransferRequestHandler 代表*.。 (两者都启用。)

EDIT5:

我发现在它工作的服务器上,我需要在 web 根目录中有任何 .cshtml 文件。如果我从 web 根目录中删除 .cshtml 并尝试从子目录中调用任何它将不起作用。

EDIT6:

我在另外两台机器上尝试过:一台使用IIS 7.5,另一台使用IIS 7.0。在IIS 7.5 上它可以工作(普通安装无配置),但在IIS 7.0 上它不起作用。

如何让它在 IIS 7.0 上运行?

【问题讨论】:

  • 我不确定我是否理解。在MVC下,你通过路由引擎调用控制器方法,使用http://mydomain/mycontroller/mycontrollermethod等形式的URL。控制器方法调用适当的 cshtml 视图。为什么要直接打开视图?
  • 因为它不是典型 MVC 应用程序的“视图”,而是一个简单的脚本。
  • 在 IIS 7 中,对于您的站点,您是否检查了 Handler Mappings 中的 *.cshtml?

标签: asp.net asp.net-mvc asp.net-mvc-3 iis razor


【解决方案1】:

耶!经过几天的挣扎,我找到了它! :))

使其在 IIS 7.0 上运行的一种方法是启用 runAllManagedModulesForAllRequests:

<modules runAllManagedModulesForAllRequests="true" />

(尽管在 IIS 7.5 上它甚至可以使用默认值 runAllManagedModulesForAllRequests="false"。)

不要问我为什么:)也许有人可以解释一下。

【讨论】:

【解决方案2】:

不确定这是否是您的特殊问题,但听起来 ASP.NET 网页没有运行(MVC 3 及更高版本依赖于 Razor 和其他东西的网页)。有时,某些东西的安装顺序可能会弄乱 ASP.NET 和 IIS 的某些配置,这反过来又会导致网页无法运行并且不会执行任何 cshtml 文件。

尝试运行 aspnet_regiis /i 来清理它。

【讨论】:

  • 普通 ASP.NET 网页运行正常。当然,我已经运行了aspnet_regiss /i(对于 .NET 4),但它没有帮助(因为它只是注册了 ASP.NET,所以我还重新安装了 ASP.NET MVC3。
  • 更具体地说是C:\Windows\Microsoft.NET\Framework\v4.0.30319&gt;aspnet_regiis -i
【解决方案3】:

有一个 IIS7.0 的修补程序,位于:http://support.microsoft.com/kb/980368

我今天在 Windows 2008 SP2 上安装了它(需要重新启动操作系统)。 IIS 7.0 中的行为现在类似于 IIS 7.5

它解决了我这边的问题/没有强迫:

<modules runAllManagedModulesForAllRequests="true" />

与为任何会导致不必要的过载的请求(甚至在 css/images/...上)运行所有模块相比,这是一种更好的方法。

【讨论】:

  • 感谢您提供的信息。我不再拥有任何带有 IIS 7.0 的 Windows Server 2008,因此必须由其他人确认。
【解决方案4】:

你确定IIS有足够的权限访问/test目录下的文件吗?

这可能会导致一些我发现的愚蠢问题。

【讨论】:

  • /test 不是目录。它应该调用 test.cshtml。此外,它会返回 403(不是 404)。
【解决方案5】:

如果这是一个 asp.net 4.0 Web 应用程序,您将需要手动设置路由,创建适当的控制器,并确保您的视图(.cshtml 文件)实际存在于 /Views/ControllerName文件夹。

我还建议您将项目设置为在您的开发环境中使用 IISExpress,以更紧密地匹配您的 Web 服务器。这对调试这类问题很有帮助。

【讨论】:

  • 我不需要设置路由、控制器,也不需要 Views 文件夹。我可以像使用旧的 .aspx 或 php 文件一样使用 .cshtml 文件。
  • @Keith 设置您的开发环境以使用 IIS Express 与您的 Web 服务器不匹配。您将在 Web 服务器上运行 IIS - 不是 IIS Express
  • @DaveBlack 这条评论来自 6 年前,当时 VS2010 风靡一时,卡西尼是默认的。许多在 Cassini 上找不到但在生产 IIS 服务器上的问题(例如 web.config)更有可能在 IIS Express 中复制。
【解决方案6】:

由于您没有使用 MVC,因此您需要设置路由,或使用 IIS 重写模块进行重写以期望 /test 解析为 /test.cshtml。没有它,你不会得到这种行为。

例如在您的应用程序启动中类似这样的内容。

routes.MapPageRoute(
   "extension-less paths",
   "{view}",
   "~/{view}.cshtml"
);

【讨论】:

  • 为什么它可以在我的本地计算机和另一台计算机上没有路由的情况下工作,相同的代码(ASP.NET 应用程序和几个独立的 .cshtml 脚本)在哪里? (只有一台服务器出现404问题。)
  • 那么你设置路由了吗?您如何将无扩展名的网址映射到.cshtml?也许你可以显示一些代码?哪些版本的 IIS 工作,哪些不工作?它们都一样吗?
  • 根本没有路由。尝试在 IIS 中创建一个简单的 ASP.NET 应用程序,在其中放置 test.cshtml 文件(例如,在其中放置“hi”)。将浏览器指向该文件(不带 .cshtml 扩展名)。
  • 如果我创建一个新的 ASP.NET 表单应用程序,创建 test.cshtml 并请求 /test 我得到一个 404。如果我尝试 /test.cshtml 我自然会得到这种类型的文件无法提供.我们需要知道您如何为.cshtml 设置路由。这是您问题的关键。你提到了一个简单的脚本?
  • 对于脚本,我的意思是test.cshtml 文件。内容可能只是“时间是@DateTime.Now。”。见 EDIT3。
【解决方案7】:

cshtml 可以工作,如果你设置了 web.conf。

你可以认为它是一个 html,但语法很简洁。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-18
    • 2010-09-13
    • 1970-01-01
    • 1970-01-01
    • 2018-05-15
    • 1970-01-01
    相关资源
    最近更新 更多