IIS为ASP.NET MVC3文件返回404(.cshtml)

时间:2011-09-09 20:11:04

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

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

相同的应用程序甚至独立的.cshtml文件都在本地计算机(使用IIS7.5 / Win7)和服务器(IIS7.5 / Win2008R2)上运行,但它不能用于IIS7的服务器0.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:

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

EDIT5:

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

EDIT6:

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

如何使其在IIS 7.0上运行?

7 个答案:

答案 0 :(得分:6)

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

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

<modules runAllManagedModulesForAllRequests="true" />

(虽然,在 IIS 7.5 上,即使使用默认值runAllManagedModulesForAllRequests="false"也能正常工作。)

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

答案 1 :(得分:5)

不确定这是否是您的特殊问题,但听起来好像ASP.NET网页没有运行(MVC 3及更高版本依赖于Razor和其他东西的网页)。有时,事情可能会被安装在破坏ASP.NET和IIS的某些配置的订单中,这反过来又会使Web页面无法运行,并且不会执行任何cshtml文件。

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

答案 2 :(得分:1)

IIS7.0上有一个修补程序:http://support.microsoft.com/kb/980368

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

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

<modules runAllManagedModulesForAllRequests="true" />

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

答案 3 :(得分:0)

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

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

答案 4 :(得分:0)

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

我还建议您设置项目以在开发环境中使用IISExpress来更紧密地匹配您的Web服务器。调试这些问题时,这是一个很好的帮助。

答案 5 :(得分:0)

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

e.g。你的应用程序开始就是这样的。

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

答案 6 :(得分:0)

如果你设置web.conf,

cshtml可以工作。

您可以认为它是一个HTML,但是使用剃刀语法。