ASP.NET 4.5 MVC 4无法在Windows Server 2008 IIS 7上运行

Dom*_*rre 53 asp.net iis asp.net-mvc windows-server-2008

显然,我遗漏了一些东西,我无法在IIS 7上的Windows Small Business Server 2008上部署简单的ASP.NET MVC 4,.NET 4.5应用程序.

安装了.NET framework 4.5.

我是否应该在应用程序池的基本设置上看到该版本(4.5)?这时候,我只有2.0和4.0,因为4.5就像3.5只添加在4.0框架之上,我想这是正常的.

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

403 - 禁止访问:访问被拒绝.您无权使用您提供的凭据查看此目录或页面.

当我请求名为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>
Run Code Online (Sandbox Code Playgroud)

编辑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应用程序按原样运行).在尝试了Martin的解决方案后,Windows 2008服务器运行良好.

kdr*_*rvn 47

试试这个:

<system.webServer>
    <modules runAllManagedModulesForAllRequests="true" />
    ...
</system.webServer>
Run Code Online (Sandbox Code Playgroud)

编辑:

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

另外,这篇文章值得一读,以了解这两者之间的区别.

  • 此设置告诉IIS为任何请求运行托管模块,即使对于静态请求(例如:images,.css,.js,...),它也会影响这些请求的性能.您可能需要阅读[本文以获取更多信息](http://blogs.msdn.com/b/tmarq/archive/2010/04/01/asp-net-4-0-enables-routing-of-extensionless -urls-不影响性,静态requests.aspx).本文作者还提供了另一种您可能想要尝试的解决方案:[安装IIS7 QFE](http://support.microsoft.com/kb/980368). (4认同)

Mar*_*rth 44

如果您无法应用kb 980368中QFE,而不是按照接受的答案中的建议使用runAllManagedModulesForAllRequests解决方案,则应使用下面显示的preCondition =""模块配置,以避免对静态内容产生负面影响,如博客文章asp.NET MVC路由如何工作及其对静态请求性能的影响,并且在使MVC路由工作时,不要使用runAllManagedModulesForAllRequests ="true"以及对答案的一些评论.

Scott Hanselman关于runAllManagedModulesForAllRequests的博客文章应该为这个论点增加一些权重.Rick Strahl 在IIS 7/8中使用runAllManagedModulesForAllRequests发布帖子是对我发现的设置之间交互的最佳解释.有关模块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>
Run Code Online (Sandbox Code Playgroud)


小智 9

我遇到了类似的问题.我尝试了这里描述的许多解决方案(Web.Config system.webServer配置条目等)无济于事.最后,我发现了我的特定安装问题.我将我的网站发布到本地文件系统,然后将这些文件复制到服务器上.事实证明,Global.asax文件不是已发布文件的一部分.复制该文件后,错误就消失了.

  • 伙计,你的回答值得+1000,认真!我花了半天时间"排除"故障路由,只是意识到我忘了部署`Global.asax`. (4认同)