XmlSchema.Read引发COMException异常“灾难性失败”

3

我有一个与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

1
FYI:Path.Combine() 可能会让你的代码更简洁。 - Thomas Weller
这是一个环境问题,低级CLR调用以确定程序集存储位置失败。通常是由于过度热心的反恶意软件或网络问题引起的。SysInternals工具是查找潜在问题的不错方式,例如Process Monitor。您程序的.config文件是触发器,我们无法看到它。 - Hans Passant
@HansPassant 这不可能是配置文件的内容问题。该程序是一个批处理程序,从输入目录读取文件,并通过Windows任务计划程序运行。有许多不同的输入文件夹按照不同的时间表进行处理,只有其中一个以这种方式系统性地失败。 - The Dag
类似但不重复:https://dev59.com/nGnWa4cB1Zd3GeqPzlpb - quetzalcoatl
1个回答

2

该程序是通过任务计划程序执行的。失败的实例在最低权限下运行。

我认为一个带有明智描述的SecurityException会更有意义,但一旦将计划任务配置为以更高权限的进程运行,问题就消失了。


我将它更改为使用最高权限运行。但是,它仍没有工作。出现了与你遇到的相同错误,但是代码是“xslTransform.Load(value);”。我不知道接下来该怎么做。 - Vikash

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接