.NET: Предотвращение веб-доступа при проверке / чтении схем XML? - PullRequest
3 голосов
/ 13 апреля 2011

Я пытаюсь запретить доступ .NET Framework к Интернету при проверке XML-документа с использованием XML-схем, потому что я не хочу, чтобы он постоянно полагался на веб-доступ. Для этого я специально создал локальные копии всех XSD, которые я использую при проверке, на локальном жестком диске, но при загрузке некоторых из этих схем он все еще не работает.

Например, этот фрагмент кода не работает (, но только если отключить мою машину из Интернета ):

using (Stream schemaStream = File.OpenRead(schemaFileName))
{
    XmlSchema schema = XmlSchema.Read(schemaStream, ValidationCallBack);
    xmlSchemaSet.Add(schema);
}

schemaFileName указывает на локально сохраненную копию файла xmldsig-core-schema.xsd. Я получаю исключение

System.Net.WebException: The remote name could not be resolved: 'www.w3.org'
Status: NameResolutionFailure
at System.Net.HttpWebRequest.GetResponse()
at System.Xml.XmlDownloadManager.GetNonFileStream(Uri uri, ICredentials credentials)
at System.Xml.XmlDownloadManager.GetStream(Uri uri, ICredentials credentials)
at System.Xml.XmlUrlResolver.GetEntity(Uri absoluteUri, String role, Type ofObjectToReturn)
at System.Xml.XmlTextReaderImpl.OpenStream(Uri uri)
at System.Xml.XmlTextReaderImpl.DtdParserProxy_PushExternalSubset(String systemId, String publicId)
at System.Xml.XmlTextReaderImpl.DtdParserProxy.System.Xml.IDtdParserAdapter.PushExternalSubset(String systemId, String publicId)
at System.Xml.DtdParser.ParseExternalSubset()
at System.Xml.DtdParser.ParseInDocumentDtd(Boolean saveInternalSubset)
at System.Xml.DtdParser.Parse(Boolean saveInternalSubset)
at System.Xml.XmlTextReaderImpl.DtdParserProxy.Parse(Boolean saveInternalSubset)
at System.Xml.XmlTextReaderImpl.ParseDoctypeDecl()
at System.Xml.XmlTextReaderImpl.ParseDocumentContent()
at System.Xml.XmlTextReaderImpl.Read()
at System.Xml.XmlTextReader.Read()
at System.Xml.Schema.Parser.StartParsing(XmlReader reader, String targetNamespace)
at System.Xml.Schema.Parser.Parse(XmlReader reader, String targetNamespace)
at System.Xml.Schema.XmlSchema.Read(XmlReader reader, ValidationEventHandler validationEventHandler)
at System.Xml.Schema.XmlSchema.Read(Stream stream, ValidationEventHandler validationEventHandler)

Я подозреваю, что он все еще пытается загрузить что-то из www.w3.org, возможно, схему DTD http://www.w3.org/2001/XMLSchema.dtd. Есть ли способ предотвратить это?

1 Ответ

3 голосов
/ 13 апреля 2011

Ну, это оказалось проще, чем я думал.Это Q / A дало мне преимущество (и обновило мою память).

У меня уже есть собственная реализация XmlResolver для перенаправления на локальные копии файлов XSD, но теперь янужно было использовать его для DTD при загрузке схем XML тоже:

using (Stream schemaStream = File.OpenRead(schemaFileName))
{
    XmlReaderSettings xmlReaderSettings = new XmlReaderSettings();
    xmlReaderSettings.XmlResolver = myXmlNamespaceResolver;
    xmlReaderSettings.ProhibitDtd = false;

    using (XmlReader reader = XmlReader.Create(schemaStream, xmlReaderSettings))
    {
        XmlSchema schema = XmlSchema.Read(reader, ValidationCallBack);
        xmlSchemaSet.Add(schema);                    
    }
 }

Тогда мне нужно было загрузить копию http://www.w3.org/2001/XMLSchema.dtd и http://www.w3.org/2001/datatypes.dtd, и теперь она работает даже без Webдоступ.

...