ASP.NET 4.5 MVC 4在Windows Server 2008 IIS 7上无法工作

54

我显然缺少了什么,我无法在安装了.NET 4.5的Windows Small Business Server 2008上的IIS 7上部署一个简单的ASP.NET MVC 4应用程序。

应用程序池基本设置中只有2.0和4.0版本,而没有4.5版本。因为4.5就像只是在4.0框架之上添加的3.5一样,所以这应该是正常的吧。

当我浏览主页时,出现以下错误:

403 - Forbidden: Access is denied. You do not have permission to view this directory or page using the credentials that you supplied.

当我请求名为Page/page/index的唯一控制器时,我得到了404未找到页面。就像ASP.NET进程从未收到http请求一样。

我可以请求一个简单的HTML页面。

应用程序池设置为.NET 4.0,并将托管管道模式设置为集成。

NETWORK SERVICE对目录具有读/写访问权限。

当然,从VS2012运行该应用程序工作得很好。

我不知道哪里做错了,搜索引擎查询也没有多大帮助。

有人有提示吗?非常感谢。

编辑

dll已经在bin文件夹中,例如System.Web.Mvc,System.Web.Razor等。

我创建了一个空的test.aspx页面,以确保asp.net工作进程能够接收请求,是的,页面没问题。所以看起来MVC路由不起作用,尽管我有一个在该服务器上正常工作的ASP.NET MVC 3 Web应用程序。

在安装.NET 4.5之后,我进行了aspnet_regiis -iru,以防万一,这在应用程序中添加了一个aspnet_client文件夹,但仍然无法解决问题。

IIS身份验证部分启用了匿名身份验证,并且授权显示允许所有用户。

安装了ASP.NET MVC 4,我只是修复了一下,以确保安装正确。

尽管安装了ASP.NET MVC 4,但从请求/page/index操作返回的404错误是由标准IIS而不是标准aspnet错误返回的。因此,看起来MVC 4框架未正确安装,但我已经进行了双重检查和修复。我应该在哪里继续调查?

@Mystere Man,我将匿名身份验证更改为使用应用程序池标识,停止,启动应用程序,仍然出现相同的错误。看起来ASP.NET MVC 4没有处理请求。

以下是web.config的一部分:

  <system.webServer>
    <validation validateIntegratedModeConfiguration="false" />
    <handlers>
      <remove name="ExtensionlessUrlHandler-ISAPI-4.0_32bit" />
      <remove name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" />
      <remove name="ExtensionlessUrlHandler-Integrated-4.0" />
      <add name="ExtensionlessUrlHandler-ISAPI-4.0_32bit" path="*." verb="*" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness32" responseBufferLimit="0" />
      <add name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" path="*." verb="*" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness64" responseBufferLimit="0" />
      <add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="*" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
    </handlers>
  </system.webServer>
  <runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
      <dependentAssembly>
        <assemblyIdentity name="System.Web.Helpers" publicKeyToken="31bf3856ad364e35" />
        <bindingRedirect oldVersion="1.0.0.0-2.0.0.0" newVersion="2.0.0.0" />
      </dependentAssembly>
      <dependentAssembly>
        <assemblyIdentity name="System.Web.Mvc" publicKeyToken="31bf3856ad364e35" />
        <bindingRedirect oldVersion="1.0.0.0-4.0.0.0" newVersion="4.0.0.0" />
      </dependentAssembly>
      <dependentAssembly>
        <assemblyIdentity name="System.Web.WebPages" publicKeyToken="31bf3856ad364e35" />
        <bindingRedirect oldVersion="1.0.0.0-2.0.0.0" newVersion="2.0.0.0" />
      </dependentAssembly>
    </assemblyBinding>
  </runtime>
  <entityFramework>
    <defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework" />
  </entityFramework>

编辑于2012/09/27

我已经重新安装了 Microsoft Framework .NET 4.5 并修复了 ASP.NET MVC 4,重新部署了简单的 ASP.NET MVC 4 应用程序,但仍然遇到相同的问题。我不确定接下来该怎么做,所以我开始悬赏希望有人能帮助我找到问题所在。

编辑于2014/01/31

当我提出这个问题时,我将 runAllManagedModulesForAllRequests 标记为采纳的答案,因为它确实解决了问题。但我肯定不会在生产中使用它。我问为什么我必须这样做,但没有得到任何答案。

然后Martin Hollingsworth的回答真正解决了我的问题,并且没有与runAllManagedModulesForAllRequests相关的性能问题。

我们几乎放弃了,打算购买一台新的 Windows 2012 服务器(ASP.NET MVC应用程序就可以正常工作)。但尝试了马丁的解决方案后,Windows 2008服务器也可以正常工作了。


你能再次确认应用程序池是否在NETWORK SERVICE帐户下运行吗? - Bart Verkoeijen
匿名身份验证已在IIS身份验证部分启用,以及Web表单身份验证,在授权部分,所有用户都被允许。还有其他地方我需要确保这些设置正确吗? - Dominic St-Pierre
2
错误信息与MVC框架缺失时的相同。您说服务器上有一个MVC3应用程序在运行,但是没有其他可用的MVC4应用程序。我建议查找MVC4框架安装相关的问题,而不是应用程序设置。另外,您可以尝试更改应用程序池设置(例如管道模式)。 - peterfoldi
1
检查匿名身份验证是否使用应用程序池用户。您可以通过进入“身份验证”,右键单击“匿名”并选择“编辑”,然后确保选中第二个单选按钮来执行此操作。或者,您可以确保将IUSR_*凭据添加到您的站点文件夹中。 - Erik Funkenbusch
这可能看起来是一个愚蠢的建议,但有时我也会犯这种错误 :) 你的物理路径是否正确输入到了你的应用程序的IIS中?多年来,我从未在部署方面遇到过任何特殊情况,所以你没有做的事情真的很小。你是否为x64和x86框架都运行了aspnet_regiis? - Alexander Selishchev
显示剩余6条评论
9个回答

46

尝试使用这个:

<system.webServer>
    <modules runAllManagedModulesForAllRequests="true" />
    ...
</system.webServer>

编辑:

上述解决方案适用于.NET 3.5或更早版本。 如果您使用的是.NET 4.0或更高版本,则可以尝试安装IIS7 QFE

此外,这篇文章值得一读,以了解它们之间的差异。


4
这个设置告诉IIS对所有请求都运行托管模块,甚至是静态请求(例如:图片、.css、.js等),所以它会影响这些请求的性能。你可能需要阅读 这篇文章 获取更多信息。该文章的作者还提供了另一种解决方案,你可能想尝试一下:安装IIS7 QFE - kdrvn
IIS7 QFE无法安装在Windows 8上,现在该怎么办? - Akash Kava
Windows 8 运行的是 IIS8,而不是 IIS7。请查看这篇文章 - kdrvn
我们正在运行安装了IIS 7和.NET 4.5的Windows Server 2008,添加<modules runAllManagedModulesForAllRequests="true" />解决了我们的问题。(因此,它的实用性并不仅限于3.5或更低版本。) - JDwyer
天啊,一年过去了,我还是花了四个小时才找到这个解决方案。IIS 真是浪费时间。 - xtravar
显示剩余2条评论

45
如果您无法应用QFE from kb 980368,那么不要像所接受的answer建议的那样使用runAllManagedModulesForAllRequests解决方案,而应该使用下面显示的带有preCondition=""的模块配置来避免静态内容的负面影响,如How asp.NET MVC Routing Works and its Impact on the Performance of Static RequestsDon't use runAllManagedModulesForAllRequests="true" when getting your MVC routing to work博客文章和一些答案评论中所述。

Scott Hanselman的关于runAllManagedModulesForAllRequests的博客文章应该会对这个论点有所帮助。Rick Strahl的文章在IIS 7/8中使用runAllManagedModulesForAllRequests需要注意的地方 是我找到的最好的解释这些设置之间相互作用的文章。值得一读的还有关于module preCondition属性的IIS文档。

请记住,如果您已经应用了QFE,则不需要进行此配置更改,因为此行为将成为默认设置。

<system.webServer>
  <modules>
    <remove name="UrlRoutingModule-4.0" />
    <add name="UrlRoutingModule-4.0" type="System.Web.Routing.UrlRoutingModule" preCondition="" />
  </modules>
</system.webServer>

是的,这是修复问题的好方法,我们购买了一个运行良好的Win 2012,并在故障的Win 2008上尝试了您的解决方案,结果如预期一样工作。我们甚至会继续使用2008服务器,因为它在没有runAllManageModulesForAllRequests的情况下可以正常工作。 - Dominic St-Pierre
如果您有安装了IIS 7.0(非R2版本)的Windows 2008服务器,则以下是热修复程序的下载链接:http://www.microsoft.com/en-us/download/details.aspx?id=11342 - Jonas Kello
太棒了!非常成功,非常好! - maxwellb

9

我曾经遇到过类似的问题。我尝试了这里描述的许多解决方案(Web.Config system.webServer配置项等),但都没有成功。最后,我发现了我特定安装的问题所在。我将网站发布到本地文件系统,然后将这些文件复制到服务器上。结果发现Global.asax文件并没有包含在发布的文件中。一旦我复制了那个文件,错误就消失了。


4
伙计,你的回答真值得加1000分,认真地!我花了半天时间“排除故障”,只是才发现我忘记部署 Global.asax - uncoder
很高兴能提供任何帮助! :) - Jesus Diaz

2

1
如SonicTheLichen所提到的,如果您是从Visual Studio发布,则默认情况下不会复制gloabal.asax文件。将global.asax复制到您的Web服务器上应该解决此问题。感谢SonicTheLichen提供解决方案。
敬礼, Saurabh

0

我知道这是旧的,但现在窗口更新浪费了我几个小时:

如果你在Global.asax中处理异常,这也可以像保持Windows更新与Dev环境一样简单......对我来说,我显然没有这样做,结果是出现了一个“无法加载...”的异常,我的global.asax试图处理它,反过来却遇到了同样的问题,隐藏了潜在的问题.....


0
我不知道这是否能解决你的问题,但它解决了我在部署MVC应用程序到IIS时遇到的一个问题。
我必须为应用程序的主目录/虚拟目录添加aspnet_isapi.dll的通配符应用程序映射。 您可以通过右键单击网站/虚拟目录并选择主目录/虚拟目录选项卡,单击配置按钮,然后在通配符应用程序映射部分下单击插入按钮来完成此操作。

C:\WINDOWS\microsoft.net\Framework64\v4.0.30319\aspnet_isapi.dll

祝你好运!


0

我曾经遇到过类似的问题。我需要将一个 .net MVC 网站部署到一个安装了 Windows 2008 和 IIS 7.5 的新服务器上。当我检查程序和功能时,发现只安装了 .Net Framework 4.5.1。我手动启用了 .Net 3.5.1 Windows 功能。但在安装了 MVC 4.0 后,路由不起作用了。

我的解决方案:
1)卸载 .Net 4.5.1 框架和 MVC 4.0
2)安装 .Net Framework 4.0
3)安装 .Net framework 4.5.1
4)安装 MVC 4.0


0

我必须在IIS网站属性的处理程序映射部分启用脚本。

Handler Mappings

打开IIS,点击相关的网站。打开处理程序映射并单击“编辑功能权限”。选中脚本和执行的框,然后单击确定。就可以了!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接