提问人:Josh 提问时间:7/21/2023 更新时间:7/21/2023 访问量:24
打开外部 DTD 时出错 - 400 错误
An error has occurred while opening external DTD - 400 Error
问:
当我尝试验证 xml 时,我遇到了第三方 dtd 间歇性地抛出 HTTP 状态 400 错误的问题。
抛出的错误是:
打开外部 DTD“http://example.com/fake/path/MyDTD.dtd”时出错:响应状态代码不指示成功:400(错误请求)。
在 System.Xml.XmlTextReaderImpl.Throw (异常 e) 在 System.Xml.XmlTextReaderImpl.PushExternalEntityOrSubset (字符串 publicId、 字符串 systemId、 uri baseUri、 字符串 entityName) 在 System.Xml.XmlTextReaderImpl.DtdParserProxy_PushExternalSubset (字符串 systemId、 字符串 publicId) 在 System.Xml.XmlTextReaderImpl.DtdParserProxy.System.Xml.IDtdParserAdapter.PushExternalSubset (字符串 systemId、 字符串 publicId)
在 System.Xml.DtdParser.ParseExternalSubset() 在 System.Xml.DtdParser.ParseInDocumentDtd (布尔值 saveInternalSubset) 在 System.Xml.DtdParser.Parse (布尔值 saveInternalSubset) 在 System.Xml.DtdParser.System.Xml.IDtdParser.ParseInternalDtd (IDtdParserAdapter 适配器,布尔值 saveInternalSubset) 在 System.Xml.XmlTextReaderImpl.ParseDtd() 在 System.Xml.XmlTextReaderImpl.ParseDoctypeDecl()
在 System.Xml.XmlTextReaderImpl.ParseDocumentContent() 在 System.Xml.XmlTextReaderImpl.Read() 在 System.Xml.XmlValidatingReaderImpl.Read() 在 MyApi.Infrastructure.Serializers.MyCustomXmlSerializer.ValidateAgainstDtd (字符串 xml,布尔值 throwOnFailure)
在 D:\a\1\s\src\Infrastructure\Serializers\MyCustomXmlSerializer.cs:第 198 行
这是我验证xml的方法:
public bool ValidateAgainstDtd(string xml, bool throwOnFailure = false)
{
var messages = new List<string>();
try
{
var settings = new XmlReaderSettings
{
ValidationType = ValidationType.DTD,
DtdProcessing = DtdProcessing.Parse,
XmlResolver = new XmlPreloadedResolver(new XmlUrlResolver())
};
settings.ValidationEventHandler += (sender, args) => messages.Add(args.Message);
using var stream = new MemoryStream(Encoding.UTF8.GetBytes(xml));
using var reader = XmlReader.Create(stream, settings);
while (reader.Read()) { } //this is line 198 in the exception
}
catch (Exception e)
{
messages.Add($"DTD Validation Exception: {e.Message}{Environment.NewLine}{e.StackTrace}");
}
if (messages.Count == 0)
{
return true;
}
if (throwOnFailure)
{
throw new CustomXmlSerializationException(messages.ToArray());
}
return false;
}
我没有收到任何其他验证错误,并且我们正在序列化的模型在几个不同的调用之间很常见,但它只在一次调用中失败,并且只是间歇性地失败 - 相同的调用在其他一些情况下有效。
在本地开发机器上作为 Nunit 套件的一部分运行的集成测试中,相同的代码工作正常,但是当我们将代码部署到我们的舞台环境中时,我们突然遇到拉回 DTD 的间歇性问题。
答: 暂无答案
评论