我有一个与XML模式相关的实用程序类,其中包含几个方法。在没有任何代码更改或环境更改的情况下,它突然开始系统性地失败。
失败的方法:
public static XmlSchema GetSchema(string xsdFileName)
{
string path = MyConfiguration.XmlSchemaLocation;
if (!path.EndsWith(@"\"))
{
path += @"\";
}
path += xsdFileName;
return XmlSchema.Read(File.OpenRead(path), null);
}
堆栈跟踪显示 XmlSchema.Read 正在尝试在内部构造 Parser 对象,该对象的构造函数试图读取某些配置,进而导致一些策略证据被检查,然后它将以 COMException 错误代码崩溃,该错误代码如果我理解正确,提供的信息不超过错误是意外的!
以下是异常信息:
System.Runtime.InteropServices.COMException (0x8000FFFF): Catastrophic failure (Exception from HRESULT: 0x8000FFFF (E_UNEXPECTED))
at System.Security.Policy.PEFileEvidenceFactory.GetLocationEvidence(SafePEFileHandle peFile, SecurityZone& zone, StringHandleOnStack retUrl)
at System.Security.Policy.PEFileEvidenceFactory.GenerateLocationEvidence()
at System.Security.Policy.PEFileEvidenceFactory.GenerateEvidence(Type evidenceType)
at System.Security.Policy.AssemblyEvidenceFactory.GenerateEvidence(Type evidenceType)
at System.Security.Policy.Evidence.GetHostEvidenceNoLock(Type type)
at System.Security.Policy.Evidence.GetHostEvidence(Type type, Boolean markDelayEvaluatedEvidenceUsed)
at System.Security.Policy.AppDomainEvidenceFactory.GenerateEvidence(Type evidenceType)
at System.Security.Policy.Evidence.GetHostEvidenceNoLock(Type type)
at System.Security.Policy.Evidence.RawEvidenceEnumerator.MoveNext()
at System.Security.Policy.Evidence.EvidenceEnumerator.MoveNext()
at System.Configuration.ClientConfigPaths.GetEvidenceInfo(AppDomain appDomain, String exePath, String& typeName)
at System.Configuration.ClientConfigPaths.GetTypeAndHashSuffix(AppDomain appDomain, String exePath)
at System.Configuration.ClientConfigPaths..ctor(String exePath, Boolean includeUserConfig)
at System.Configuration.ClientConfigPaths.GetPaths(String exePath, Boolean includeUserConfig)
at System.Configuration.ClientConfigurationHost.RequireCompleteInit(IInternalConfigRecord record)
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)
at System.Configuration.ConfigurationManager.GetSection(String sectionName)
at System.Xml.Schema.Parser..ctor(SchemaType schemaType, XmlNameTable nameTable, SchemaNames schemaNames, ValidationEventHandler eventHandler)
at System.Xml.Schema.XmlSchema.Read(XmlReader reader, ValidationEventHandler validationEventHandler)
at MyProj.Common.XSDValidator.GetSchema(String xsdFileName)
at ...
有什么想法可以进一步调查吗?是否有人知道是什么原因导致这种情况发生(例如,执行该进程的身份下的损坏用户配置文件)?
这在生产环境中发生,我真的不知道如何继续找出原因或修复它。
如果相关的话:代码托管在控制台应用程序中。请注意,在代码崩溃之前不久代码已成功访问了配置。(“MyConfiguration”类是另一个实用程序类,基本上是一个薄层封装了一堆appSettings键,使用普通的System.Configuration.ConfigurationManager类。)
Windows版本:
OS Name: Microsoft® Windows Server® 2008 Datacenter
OS Version: 6.0.6002 Service Pack 2 Build 6002
OS Manufacturer: Microsoft Corporation
OS Configuration: Member Server
OS Build Type: Multiprocessor Free