内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用
很显然,我错过了一些东西,我无法在IIS 7上的Windows Small Business Server 2008上部署简单的ASP.NET MVC 4,.NET 4.5应用程序。
.NET框架4.5安装。
我是否应该在应用程序的应用程序池基本设置上看到该版本(4.5)?在这个时候,我只有2.0和4.0,因为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已经在System.Web.Mvc,System.Web.Razor等bin文件夹中。
我创建了一个空的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>
我重新配对了Microsoft Framework .NET 4.5并修复了ASP.NET MVC 4,重新部署了简单的ASP.NET MVC 4应用程序,并且我仍然得到相同的行为。
当我问这个问题时,我将runAllManagedModulesForAllRequests标记为接受的答案,因为它确实解决了问题。但我当然不会在生产中使用它。我问为什么我必须这样做,并没有任何答案。
我们几乎放弃了,并购买了一台新的Windows 2012服务器(ASP.NET MVC应用程序就像这样工作)。
如果无法应用kb 980368中的QFE,应该使用下面显示的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>
尝试使用这个:
<system.webServer>
<modules runAllManagedModulesForAllRequests="true" />
...
</system.webServer>
上述解决方案适用于.NET 3.5或更低版本。如果您使用的是.NET 4.0或更高版本,则可能需要尝试安装IIS7 QFE
此外,这篇文章值得阅读,以了解这两者之间的差异。