将下载的 XML 作为流传递给 .NET XmlReader
把经代理获得的响应流交给 XML 解析器,而不是让它再次抓取原始 URL。
HTTP 客户端通过正确的代理下载 XML。下一行却从原始 URL 创建 XML 读取器,这一行会重新发起一次抓取,而不是解析已下载的数据。
对于已经配置好目标路由的客户端,把它的响应流交给解析器:
using var response = await client.GetAsync(documentUri);
response.EnsureSuccessStatusCode();
using var stream = await response.Content.ReadAsStreamAsync();
var settings = new XmlReaderSettings
{
DtdProcessing = DtdProcessing.Prohibit,
XmlResolver = null
};
using var reader = XmlReader.Create(stream, settings, documentUri.AbsoluteUri);
var document = XDocument.Load(reader);
相关的命名空间是 System.Xml 和 System.Xml.Linq。示例特意禁用了 DTD 处理和外部解析;这并不是借同一个客户端获取任意外部实体的做法。
基 URI 保留了文档的位置元数据。如果经过批准的解析或校验流程确实要获取外部架构或其他依赖,这些获取行为需要各自明确的解析器和路由设计。
不要通过更改第一个、成功客户端的密码来诊断第二次网络故障。先确定解析器收到的是流还是 URL,然后单独跟进任何附加资源。