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;

受影响的 API