2010-10-08 6 views
6

J'ai un service Web qui traite une requête HTTP. Le document qu'il reçoit a un DOCTYPE incorporé qui spécifie un fichier .dtd. Je souhaite utiliser un fichier de validation de schéma XML plus récent, créé lorsque de nouveaux appareils se connectent à mon service.Ignorer DOCTYPE .dtd, mais le fichier .dtd doit toujours exister

Je peux ignorer avec succès la validation qui se passe dans le fichier .dtd, mais le fichier .dtd doit exister sur mon disque dur local. Je veux supprimer ces fichiers obsolètes, et n'ai pas trouvé un moyen.

document XML Exemple Je traitement:

<?xml version="1.0" encoding="us-ascii" standalone="no"?> 
<!DOCTYPE SomeMessage SYSTEM "SomeMessage.dtd"> 
<SomeMessage>data</SomeMessage> 

La fonction que j'utilise pour ouvrir le document:

private void LoadXmlDoc(XmlTextReader myXmlTextReader) 
{ 
    XmlReaderSettings readerSettings = new XmlReaderSettings(); 
    readerSettings.ValidationType = ValidationType.Schema; 
    readerSettings.Schemas.Add(null, MyGoodSchemaFile); 
    readerSettings.DtdProcessing = DtdProcessing.Ignore; 
    readerSettings.XmlResolver = null; // Added as a test. 

    readerSettings.ValidationEventHandler += ValidationEventHandle; 
    XmlReader myXmlReader = XmlReader.Create(myXmlTextReader, readerSettings); 

    XmlDocument myXmlDocument = new XmlDocument(); 
    myXmlDocument.XmlResolver = null; // Added as a test. 
    myXmlDocument.Load(myXmlReader); // Exception thrown here! 
} 

L'exception qui est pris:

 
System.IO.FileNotFoundException: Could not find file 'c:\windows\system32\inetsrv\SomeMessage.dtd'. 
File name: 'c:\windows\system32\inetsrv\SomeMessage.dtd' 
    at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath) 

Le le contenu du fichier SomeMessage.dtd n'est pas utilisé - il est ignoré comme je le désire. Toutefois, le fichier factice "c: \ windows \ system32 \ inetsrv \ SomeMessage.dtd" doit exister, sinon l'exception est levée.

Je suis en cours d'exécution sur Windows 7, en utilisant Visual Studio 2010 et .Net 4.0

Comment puis-je ignorer le .dtd embeded et pas non plus besoin d'un fichier .dtd factice pour être installé sur mon ordinateur?

+0

Quel genre de service Web est-ce? Home cultivé ou un service Web ASP.NET (.asmx)? Est-ce le client du service Web qui recherche la DTD? – Kev

+0

Il s'agit d'un service .aspx avec un fichier C# .aspx.cs. Je ne pense pas que cela compte, cependant. Je pense que tout document XML qui est lu par l'extrait de code ci-dessus qui a une ligne DOCTYPE avec .dtd aura l'erreur, peu importe où vous l'exécutez. –

Répondre

9

La solution est de mettre la XmlResolver null du XmlTextReader sous-jacente. Modification du XmlReaderSettings.XmlResolver = null n'a pas aidé, ni ne la mise en XmlDocument.XmlResolver = null

Voici la fonction corrigée:

+0

Vous m'avez sauvé la vie! J'ai développé une DLL qui fonctionne parfaitement dans le formulaire. Mais après l'avoir attaché à une application web .NET, il s'est écrasé sur le dtd. Donc, cela n'est nécessaire que dans les applications Web. Merci! – bert