该方法 System.Xml.XmlSecureResolver.GetEntity(Uri, String, Type) 在运行时无条件引发 XmlException 。 如果应用程序利用 XmlSecureResolver 并尝试通过它解析 XML 资源,则解析将失败并出现异常。
此外,整个 System.Xml.XmlSecureResolver 类型已过时。 对此类型的所有引用都将在生成时产生 SYSLIB0047 警告。 如果已启用警告作为错误,则如果应用程序引用 XmlSecureResolver,这将导致构建中断。
using System.Xml;
// Compiler warning SYSLIB0047: XmlSecureResolver type is obsolete.
XmlResolver resolver = new XmlSecureResolver(
resolver: new XmlUrlResolver(),
securityUrl: "https://www.example.com/");
// Call to XmlSecureResolver.GetEntity below throws XmlException at run time.
object entity = resolver.GetEntity(
absoluteUri: new Uri("https://www.example.com/some-entity"),
role: null,
ofObjectToReturn: null);
以前的行为
在 .NET Framework 中, XmlSecureResolver.GetEntity(Uri, String, Type) 构造代码访问安全性 (CAS) 沙盒以限制外部 XML 资源解析过程。 如果违反政策,则会引发 SecurityException。
在 .NET Core 3.1 和 .NET 6 中, XmlSecureResolver.GetEntity(Uri, String, Type) 根本不会限制外部 XML 资源解析。 允许无限制地进行外部资源解析。
新行为
从 .NET 7 开始, XmlSecureResolver.GetEntity(Uri, String, Type) 无条件地抛出一个 XmlException。 它不构造 CAS 沙盒,也不会尝试解析外部资源。
已引入的版本
.NET 7
破坏性变更的类型
更改原因
此更改可提高 .NET 生态系统的安全性。 在 .NET 7 或更高版本上运行时,此弃用会将XmlSecureResolver的行为从故障危险(始终执行解析)改为故障安全(从不执行解析)。
建议的措施
请考虑改用新引入的静态属性 XmlResolver.ThrowingResolver。 此属性提供一个禁止XmlResolver外部资源解析的实例。
using System.Xml;
// BAD: Do not use XmlSecureResolver.
// XmlResolver resolver = new XmlSecureResolver(
// resolver: new XmlUrlResolver(),
// securityUrl: "https://www.example.com/");
// GOOD: Use XmlResolver.ThrowingResolver instead.
XmlResolver resolver = XmlResolver.ThrowingResolver;