닷넷 응용 프로그램 실행 시 0x80131401 예외 발생
다음과 같은 예외가 발생한다면?
Server Error in '/' Application.
--------------------------------------------------------------------------------
Configuration Error
Description: An error occurred during the processing of a configuration file required to service this request. Please review the specific error details below and modify your configuration file appropriately.
Parser Error Message: An error occurred creating the configuration section handler for system.codedom: Loading this assembly would produce a different grant set from other instances. (Exception from HRESULT: 0x80131401)
Source Error:
An application error occurred on the server. The current custom error settings for this application prevent the details of the application error from being viewed remotely (for security reasons). It could, however, be viewed by browsers running on the local server machine.
Source File: C:\WINDOWS\Microsoft.NET\Framework\v4.0.30319\Config\web.config Line: 50
--------------------------------------------------------------------------------
Version Information: Microsoft .NET Framework Version:4.0.30319; ASP.NET Version:4.0.30319.1031
아쉬운 것은, 어떤 DLL을 로드하다가 실패했는지 알 수 없다는 점입니다. 심지어 이벤트 로그를 살펴봐도,
Event code: 3008
Event message: A configuration error has occurred.
Event time: 2018-03-16 오전 9:07:16
Event time (UTC): 2018-03-16 오전 12:07:16
Event ID: a144b120efee431783f32b3fb1ffe2f4
Event sequence: 1
Event occurrence: 1
Event detail code: 0
Application information:
Application domain: /LM/W3SVC/1053363633/Root-39211-131656324365434624
Trust level: Full
Application Virtual Path: /
Application Path: D:\TestWebSiteV4\
Machine name: win2003test
Process information:
Process ID: 2616
Process name: w3wp.exe
Account name: NT AUTHORITY\SYSTEM
Exception information:
Exception type: ConfigurationErrorsException
Exception message: An error occurred creating the configuration section handler for system.codedom: Loading this assembly would produce a different grant set from other instances. (Exception from HRESULT: 0x80131401) (C:\WINDOWS\Microsoft.NET\Framework\v4.0.30319\Config\web.config line 50)
at System.Configuration.BaseConfigurationRecord.EvaluateOne(String[] keys, SectionInput input, Boolean isTrusted, FactoryRecord factoryRecord, SectionRecord sectionRecord, Object parentResult)
at System.Configuration.BaseConfigurationRecord.Evaluate(FactoryRecord factoryRecord, SectionRecord sectionRecord, Object parentResult, Boolean getLkg, Boolean getRuntimeObject, Object& result, Object& resultRuntimeObject)
at System.Configuration.BaseConfigurationRecord.GetSectionRecursive(String configKey, Boolean getLkg, Boolean checkPermission, Boolean getRuntimeObject, Boolean requestIsHere, Object& result, Object& resultRuntimeObject)
at System.Configuration.BaseConfigurationRecord.GetSectionRecursive(String configKey, Boolean getLkg, Boolean checkPermission, Boolean getRuntimeObject, Boolean requestIsHere, Object& result, Object& resultRuntimeObject)
at System.Configuration.BaseConfigurationRecord.GetSection(String configKey, Boolean getLkg, Boolean checkPermission)
at System.Configuration.BaseConfigurationRecord.GetSection(String configKey)
at System.Web.Configuration.HttpConfigurationSystem.GetApplicationSection(String sectionName)
at System.Web.Configuration.HttpConfigurationSystem.GetSection(String sectionName)
at System.Web.Configuration.HttpConfigurationSystem.System.Configuration.Internal.IInternalConfigSystem.GetSection(String configKey)
at System.Configuration.ConfigurationManager.GetSection(String sectionName)
at System.Configuration.PrivilegedConfigurationManager.GetSection(String sectionName)
at System.CodeDom.Compiler.CodeDomProvider.get_Config()
at System.CodeDom.Compiler.CodeDomProvider.GetCompilerInfoForExtensionNoThrow(String extension)
at System.CodeDom.Compiler.CodeDomProvider.IsDefinedExtension(String extension)
at System.Web.Compilation.CompilationUtil.GetProviderOptions(Type codeDomProviderType)
at System.Web.Compilation.CompilationUtil.GetProviderOption(Type codeDomProviderType, String providerOption)
at System.Web.Compilation.CompilationUtil.GetCompilerVersion(Type codeDomProviderType)
at System.Web.Compilation.MultiTargetingUtil.GetCSharpCompilerVersion()
at System.Web.Compilation.MultiTargetingUtil.ValidateCompilerVersionFor40AndAbove()
at System.Web.Compilation.MultiTargetingUtil.InitializeTargetFrameworkNameFor40AndAbove(String targetFrameworkMoniker)
at System.Web.Compilation.MultiTargetingUtil.InitializeTargetFrameworkName()
at System.Web.Compilation.MultiTargetingUtil.EnsureFrameworkNamesInitialized()
at System.Web.Compilation.BuildManager.Initialize()
at System.Web.Compilation.BuildManager.InitializeBuildManager()
at System.Web.HttpRuntime.HostingInit(HostingEnvironmentFlags hostingFlags, PolicyLevel policyLevel, Exception appDomainCreationException)
Loading this assembly would produce a different grant set from other instances. (Exception from HRESULT: 0x80131401)
at System.Xml.XmlDocument.Load(XmlReader reader)
at System.Configuration.ErrorInfoXmlDocument.LoadFromConfigXmlReader(ConfigXmlReader reader)
at System.Configuration.ErrorInfoXmlDocument.CreateSectionXmlNode(ConfigXmlReader reader)
at System.Configuration.RuntimeConfigurationRecord.RuntimeConfigurationFactory.CreateSectionImpl(RuntimeConfigurationRecord configRecord, FactoryRecord factoryRecord, SectionRecord sectionRecord, Object parentConfig, ConfigXmlReader reader)
at System.Configuration.RuntimeConfigurationRecord.RuntimeConfigurationFactory.CreateSectionWithFullTrust(RuntimeConfigurationRecord configRecord, FactoryRecord factoryRecord, SectionRecord sectionRecord, Object parentConfig, ConfigXmlReader reader)
at System.Configuration.RuntimeConfigurationRecord.RuntimeConfigurationFactory.CreateSection(Boolean inputIsTrusted, RuntimeConfigurationRecord configRecord, FactoryRecord factoryRecord, SectionRecord sectionRecord, Object parentConfig, ConfigXmlReader reader)
at System.Configuration.RuntimeConfigurationRecord.CreateSection(Boolean inputIsTrusted, FactoryRecord factoryRecord, SectionRecord sectionRecord, Object parentConfig, ConfigXmlReader reader)
at System.Configuration.BaseConfigurationRecord.CallCreateSection(Boolean inputIsTrusted, FactoryRecord factoryRecord, SectionRecord sectionRecord, Object parentConfig, ConfigXmlReader reader, String filename, Int32 line)
Request information:
Request URL: http://localhost:8010/about.aspx
Request path: /about.aspx
User host address: 127.0.0.1
User:
Is authenticated: False
Authentication Type:
Thread account name: NT AUTHORITY\SYSTEM
Thread information:
Thread ID: 37
Thread account name: NT AUTHORITY\SYSTEM
Is impersonating: False
Stack trace: at System.Configuration.BaseConfigurationRecord.EvaluateOne(String[] keys, SectionInput input, Boolean isTrusted, FactoryRecord factoryRecord, SectionRecord sectionRecord, Object parentResult)
at System.Configuration.BaseConfigurationRecord.Evaluate(FactoryRecord factoryRecord, SectionRecord sectionRecord, Object parentResult, Boolean getLkg, Boolean getRuntimeObject, Object& result, Object& resultRuntimeObject)
at System.Configuration.BaseConfigurationRecord.GetSectionRecursive(String configKey, Boolean getLkg, Boolean checkPermission, Boolean getRuntimeObject, Boolean requestIsHere, Object& result, Object& resultRuntimeObject)
at System.Configuration.BaseConfigurationRecord.GetSectionRecursive(String configKey, Boolean getLkg, Boolean checkPermission, Boolean getRuntimeObject, Boolean requestIsHere, Object& result, Object& resultRuntimeObject)
at System.Configuration.BaseConfigurationRecord.GetSection(String configKey, Boolean getLkg, Boolean checkPermission)
at System.Configuration.BaseConfigurationRecord.GetSection(String configKey)
at System.Web.Configuration.HttpConfigurationSystem.GetApplicationSection(String sectionName)
at System.Web.Configuration.HttpConfigurationSystem.GetSection(String sectionName)
at System.Web.Configuration.HttpConfigurationSystem.System.Configuration.Internal.IInternalConfigSystem.GetSection(String configKey)
at System.Configuration.ConfigurationManager.GetSection(String sectionName)
at System.Configuration.PrivilegedConfigurationManager.GetSection(String sectionName)
at System.CodeDom.Compiler.CodeDomProvider.get_Config()
at System.CodeDom.Compiler.CodeDomProvider.GetCompilerInfoForExtensionNoThrow(String extension)
at System.CodeDom.Compiler.CodeDomProvider.IsDefinedExtension(String extension)
at System.Web.Compilation.CompilationUtil.GetProviderOptions(Type codeDomProviderType)
at System.Web.Compilation.CompilationUtil.GetProviderOption(Type codeDomProviderType, String providerOption)
at System.Web.Compilation.CompilationUtil.GetCompilerVersion(Type codeDomProviderType)
at System.Web.Compilation.MultiTargetingUtil.GetCSharpCompilerVersion()
at System.Web.Compilation.MultiTargetingUtil.ValidateCompilerVersionFor40AndAbove()
at System.Web.Compilation.MultiTargetingUtil.InitializeTargetFrameworkNameFor40AndAbove(String targetFrameworkMoniker)
at System.Web.Compilation.MultiTargetingUtil.InitializeTargetFrameworkName()
at System.Web.Compilation.MultiTargetingUtil.EnsureFrameworkNamesInitialized()
at System.Web.Compilation.BuildManager.Initialize()
at System.Web.Compilation.BuildManager.InitializeBuildManager()
at System.Web.HttpRuntime.HostingInit(HostingEnvironmentFlags hostingFlags, PolicyLevel policyLevel, Exception appDomainCreationException)
역시 정보가 없습니다. 메시지에서 의미하는 50 번째 라인은 "C:\WINDOWS\Microsoft.NET\Framework\v4.0.30319\Config\web.config" 파일에서 다음과 같이 codedom 설정이 시작되는 구간입니다.
<system.codedom>
<compilers>
<compiler language="c#;cs;csharp" extension=".cs" warningLevel="4" type="Microsoft.CSharp.CSharpCodeProvider, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<providerOption name="CompilerVersion" value="v4.0"/>
<providerOption name="WarnAsError" value="false"/>
</compiler>
<compiler language="vb;vbs;visualbasic;vbscript" extension=".vb" warningLevel="4" type="Microsoft.VisualBasic.VBCodeProvider, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<providerOption name="CompilerVersion" value="v4.0"/>
<providerOption name="OptionInfer" value="true"/>
<providerOption name="WarnAsError" value="false"/>
</compiler>
</compilers>
</system.codedom>
이벤트 로그에는 나오지 않지만 "Loading this assembly would produce a different grant set from other instances" 메시지는 System.IO.FileLoadException 예외가 발생했을 때 볼 수 있는 것입니다.
위의 오류가 발생한 이유는 응용 프로그램의 이력을 살펴보는 것으로 해결할 수 있었습니다. 배경을 설명해 보면, .NET 4.5부터 추가된 System.Net.Http.dll 어셈블리를 참조해 Windows Server 2003에 배포한 것입니다. 즉, System.Net.Http.dll 파일을 로드할 수 없어 저런 예외가 발생한 것입니다. (.NET 4.5는 Windows Server 2003을 지원하지 않아 문제가 발생한 환경에서는 System.Net.Http.dll이 없었던 것입니다.)
혹시나 0x80131401 예외가 발생한다면? 해당 머신에 설치되지 않은 구성 요소가 있는지? 또는 새롭게 배포한 프로젝트에 신규로 추가한 참조 어셈블리가 있는지 확인해 보시면 됩니다.
[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]