Exchange Server 2013 ECP加载AjaxControlToolkit程序集失败求助
问题描述
用户登录Exchange 2013的ECP后出现以下服务器错误:
'/ecp'应用程序中的服务器错误。
无法加载文件或程序集'2017-12-31 19-00 Copy of AjaxControlToolkit'或其依赖项。找到的程序集清单定义与程序集引用不匹配。(HRESULT异常: 0x80131040)
描述: 当前Web请求执行期间发生未处理的异常。请查看堆栈跟踪以获取有关错误及其在代码中起源位置的更多信息。
异常详细信息: System.IO.FileLoadException: 无法加载文件或程序集'2017-12-31 19-00 Copy of AjaxControlToolkit'或其依赖项。找到的程序集清单定义与程序集引用不匹配。(HRESULT异常: 0x80131040)
源错误: 当前Web请求执行期间生成了未处理的异常。可以使用下面的异常堆栈跟踪来确定异常的起源和位置信息。
程序集加载跟踪: 以下信息有助于确定无法加载程序集'2017-12-31 19-00 Copy of AjaxControlToolkit'的原因。
警告: 程序集绑定日志记录已关闭。要启用程序集绑定失败日志记录,请将注册表值[HKLM\Software\Microsoft\Fusion!EnableLog] (DWORD)设置为1。注意: 程序集绑定失败日志记录会带来一些性能损失。要关闭此功能,请删除注册表值[HKLM\Software\Microsoft\Fusion!EnableLog]。
堆栈跟踪:
[FileLoadException: 无法加载文件或程序集'2017-12-31 19-00 Copy of AjaxControlToolkit'或其依赖项。找到的程序集清单定义与程序集引用不匹配。(HRESULT异常: 0x80131040)]
System.Reflection.RuntimeAssembly._nLoad(AssemblyName fileName, String codeBase, Evidence assemblySecurity, RuntimeAssembly locationHint, StackCrawlMark& stackMark, IntPtr pPrivHostBinder, Boolean throwOnFileNotFound, Boolean forIntrospection, Boolean suppressSecurityChecks) +0
System.Reflection.RuntimeAssembly.InternalLoadAssemblyName(AssemblyName assemblyRef, Evidence assemblySecurity, RuntimeAssembly reqAssembly, StackCrawlMark& stackMark, IntPtr pPrivHostBinder, Boolean throwOnFileNotFound, Boolean forIntrospection, Boolean suppressSecurityChecks) +210
System.Reflection.RuntimeAssembly.InternalLoad(String assemblyString, Evidence assemblySecurity, StackCrawlMark& stackMark, IntPtr pPrivHostBinder, Boolean forIntrospection) +242
System.Reflection.RuntimeAssembly.InternalLoad(String assemblyString, Evidence assemblySecurity, StackCrawlMark& stackMark, Boolean forIntrospection) +17
System.Reflection.Assembly.Load(String assemblyString) +35
System.Web.Configuration.CompilationSection.LoadAssemblyHelper(String assemblyName, Boolean starDirective) +122
[ConfigurationErrorsException: 无法加载文件或程序集'2017-12-31 19-00 Copy of AjaxControlToolkit'或其依赖项。找到的程序集清单定义与程序集引用不匹配。(HRESULT异常: 0x80131040)]
System.Web.Configuration.CompilationSection.LoadAssemblyHelper(String assemblyName, Boolean starDirective) +12761078
System.Web.Configuration.CompilationSection.LoadAllAssembliesFromAppDomainBinDirectory() +503
System.Web.Configuration.AssemblyInfo.get_AssemblyInternal() +142
System.Web.Compilation.BuildManager.GetReferencedAssemblies(CompilationSection compConfig) +334
System.Web.Compilation.BuildManager.CallPreStartInitMethods(String preStartInitListPath) +203
System.Web.Compilation.BuildManager.ExecutePreAppStart() +152
System.Web.Hosting.HostingEnvironment.Initialize(ApplicationManager appManager, IApplicationHost appHost, IConfigMapPathFactory configMapPathFactory, HostingEnvironmentParameters hostingParameters, PolicyLevel policyLevel, Exception appDomainCreationException) +1151
[HttpException (0x80004005): 无法加载文件或程序集'2017-12-31 19-00 Copy of AjaxControlToolkit'或其依赖项。找到的程序集清单定义与程序集引用不匹配。(HRESULT异常: 0x80131040)]
System.Web.HttpRuntime.FirstRequestInit(HttpContext context) +12881540
System.Web.HttpRuntime.EnsureFirstRequestInit(HttpContext context) +159
System.Web.HttpRuntime.ProcessRequestNotificationPrivate(IIS7WorkerRequest wr, HttpContext context) +12722601
错误原因
这个问题是因为ECP应用程序的配置文件错误引用了带日期后缀的AjaxControlToolkit副本文件,或者该副本文件的版本与程序集清单定义不匹配,导致IIS无法正确加载程序集。
解决步骤
步骤1:检查并修正ECP的Web.config配置
- 找到ECP站点的Web.config文件,路径通常是:
C:\Program Files\Microsoft\Exchange Server\V15\ClientAccess\ecp\web.config - 用记事本或专业编辑器(比如Notepad++)打开文件,搜索字符串
2017-12-31 19-00 Copy of AjaxControlToolkit - 将所有出现该字符串的地方替换为原始的
AjaxControlToolkit - 同时检查程序集的版本号,确保配置中
assembly="AjaxControlToolkit, Version=xxx.xxx.xxx.xxx, Culture=neutral, PublicKeyToken=28f01b0e84b6d53e"里的版本号和实际文件一致
- 找到ECP站点的Web.config文件,路径通常是:
步骤2:清理ECP bin目录的冗余程序集
- 进入ECP的bin目录:
C:\Program Files\Microsoft\Exchange Server\V15\ClientAccess\ecp\bin - 删除名为
2017-12-31 19-00 Copy of AjaxControlToolkit.dll的副本文件 - 右键保留的
AjaxControlToolkit.dll→属性→详细信息,查看文件版本,确认和Web.config中的版本匹配
- 进入ECP的bin目录:
步骤3:重置IIS和ECP应用池
- 以管理员身份打开命令提示符
- 运行命令:
iisreset /noforce,等待IIS重置完成 - 或者打开IIS管理器,找到
MSExchangeECPAppPool应用池,右键选择「回收」
步骤4:(可选)重新注册程序集到全局程序集缓存
如果上述步骤无效,尝试将正确的程序集注册到GAC:- 管理员命令提示符中运行:
C:\Windows\Microsoft.NET\Framework64\v4.0.30319\gacutil.exe /i "C:\Program Files\Microsoft\Exchange Server\V15\ClientAccess\ecp\bin\AjaxControlToolkit.dll" - 完成后再次重置IIS
- 管理员命令提示符中运行:
注意事项
- 操作前务必备份Web.config文件和bin目录下的程序集,避免操作失误导致更大问题
- 尽量在业务低峰期进行操作,减少对用户的影响
内容的提问来源于stack exchange,提问作者Khoem Vichet

