XmlSecureResolver 已过时
方法 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;