我正在尝试在我们的生产服务器上安装 MVC3 应用程序,但没有成功。该应用程序来自第三方(已编译),因此我无法进行调试。此外,我强烈怀疑错误发生在网站中的任何代码有机会执行之前。
据我所知,我们的临时服务器与生产服务器的设置完全相同。两者都运行 Windows Server 2008 Standard R2,也都运行 Sharepoint 2010 站点(尽管此安装不会以任何方式触及它)。IIS 是版本 7.5,并且(最近)安装了 .NET Framework 4.0(MVC 应用程序所需)(由我安装,之后重新启动)。该应用程序非常小巧简单,据我所知,它遵循相当标准的功能 - 包括表单身份验证(即它不会使用任何肮脏的技巧)。
浏览器中显示的错误信息非常普遍:
HTTP Error 500.0 - Internal Server Error
An error message detailing the cause of this specific request failure
can be found in the application event log of the web server. Please review
this log entry to discover what caused this error to occur.
应用程序事件日志中有关“详细说明原因的错误消息”的内容似乎只是猜测 - 虔诚地希望实际导致错误的代码都会记录下来。事件日志中没有找到任何有用的信息(只有 IIS 记录的相同消息)。
Module: AspNetInitClrHostFailureModule
Notification: BeginRequest
Handler: StaticFile
Error Code: 0x80070002
Requested URL: http://xxxxxx.xxxxxx.xx:80/
Physical Path: C:\Xxxxxxx\Prod\WebClient
Logon Method: Not yet determined
Logon User: Not yet determined
使用失败请求跟踪,我能够将错误(如上所述)跟踪到 AspNetInitClrHostFailureModule:
103. -NOTIFY_MODULE_START
ModuleName AspNetInitClrHostFailureModule
Notification 1
fIsPostNotification false
Notification BEGIN_REQUEST
104. -SET_RESPONSE_ERROR_DESCRIPTION
ErrorDescription An error message detailing the cause of this specific
request failure can be found in the application event log of the web server.
Please review this log entry to discover what caused this error to occur.
105. -MODULE_SET_RESPONSE_ERROR_STATUS
ModuleName AspNetInitClrHostFailureModule
Notification 1
HttpStatus 500
HttpReason Internal Server Error
HttpSubStatus 0
ErrorCode 2147942402
ConfigExceptionInfo
Notification BEGIN_REQUEST
ErrorCode The system cannot find the file specified. (0x80070002)
就是这样。看起来,AspNetInitClrHostFailureModule 找不到某个文件。因此,存在一些问题:
是什么AspNetInitClrHostFailureModule?它没有列在 IIS 管理器中为网站配置的相当详尽的模块列表中。我在谷歌上也没有成功搜索到它。也许这是秘密……
我访问了网站的根 URL。这应该由 FormsAuthenticationModule 重定向到 /Account/LogOn。那么为什么处理程序静态文件? 这是线索吗?
我尝试删除臭名昭著的 system.webserver/modules/运行所有管理模块以适应所有请求属性,这样错误就会消失(但 MVC 实际上并没有工作,当然)。如果需要的话,我准备手动指定所有必要的模块,但如果确实需要 AspNetInitClrHostFailureModule,我也会陷入困境。有谁知道,或者有人可以给我介绍一个知道典型 MVC3 应用程序到底需要哪些模块的人吗?
这个问题很可能是这个,但他没有得到任何有用的答案,而且问的问题也不太具体。所以我自己去试试。
希望得到一些帮助:)
编辑:我现在尝试在服务器上设置一个简单的 MVC 3 项目。我使用 MVC 应用程序模板创建了一个新项目,对其进行了编译并将其部署到服务器。它的行为完全相同。服务器根本无法运行 MVC 3 项目。
答案1
我会卸载并重新安装 ASP.NET。安装 .NET Framework 后,我遇到了一些问题,现在我几乎经常这样做。
卸载方法:
C:\Windows\Microsoft.NET\Framework64\v4.0.30319\aspnet_regiis.exe -ua
重新安装:
C:\Windows\Microsoft.NET\Framework64\v4.0.30319\aspnet_regiis.exe -i
如果您需要运行 32 位应用程序,您还需要运行 C:\Windows\Microsoft.NET\Framework\v4.0.30319 文件夹中的 aspnet_regiis。请注意,如果正在运行其他 ASP.NET Web 应用程序,则执行重新安装将会影响这些应用程序。
由于问题出现得如此之早,启用 .NET Framework Fusion 日志记录可能会有所帮助。这旨在提供有关程序集加载过程中发生的情况的详细信息。
如果所有程序集都加载正常,我会使用 Process Monitor 进行跟踪。这可能会为您指明发生故障时正在做什么的正确方向。
http://www.hanselman.com/blog/BackToBasicsUsingFusionLogViewerToDebugObscureLoaderErrors.aspx
如果是缺少程序集的问题,您可以通过检查清单来确定应用程序需要哪些程序集。这可以使用 ildasm.exe(IL 反汇编程序)或 ILSpy 来完成。
我看到很多 MVC 应用程序在启动时崩溃,并在引入新服务器时出现毫无意义的错误消息,因为程序集 (dll) 存在于开发或测试中,但在新服务器上不存在。如果是这种情况,则可能是以下程序集之一需要复制到网站的 bin 文件夹中:
Microsoft.Web.Infrastructure.dll
System.Net.Http.dll
System.Net.Http.Formatting.dll
System.Net.Http.WebRequest.dll
System.Web.Extensions.dll
System.Web.Helpers.dll
System.Web.Http.dll
System.Web.Http.SelfHost.dll
System.Web.Http.WebHost.dll
System.Web.Mvc.dll
System.Web.Optimization.dll
System.Web.Providers.dll
System.Web.Razor.dll
System.Web.WebPages.Deployment.dll
System.Web.WebPages.dll
System.Web.WebPages.Razor.dll
当您正确安装 ASP.NET MVC msi 时,它通常会将其中许多文件复制到 C:\Program Files x86 中的文件夹中,或 C:\Windows\winsxs 下的某个位置(全局程序集缓存)。
请注意,如果供应商正在签署其程序集,但这些程序集是延迟签署的,则也可能会出现此问题。这也将在 Fusion 日志中显示。该症状的描述如下:
延迟签署程序集
http://msdn.microsoft.com/en-us/library/t07a3dye.aspx
答案2
胡乱猜测 :
由于它看起来像是模块加载失败,您是否检查过链接到您的网站的应用程序池的参数是否设置为正确的 .Net 版本?DefaultAppPool 是 .net v2.0。MVC 应该位于“集成”的“v4.0”应用程序池中(默认名称为 ASP.NET v4.0)。