2009-12-11 13 views
1

J'ai examiné de nombreux exemples pour valider un fichier XML par rapport à une DTD, mais je n'en ai pas trouvé un qui me permette d'utiliser un proxy. J'ai un fichier CXML comme suit (en abrégé pour l'affichage) que je souhaite valider:Valide un fichier Xml par rapport à une DTD avec un proxy. C# 2.0

<?xml version="1.0" encoding="utf-8"?> 
<!DOCTYPE cXML SYSTEM "http://xml.cxml.org/schemas/cXML/1.2.018/InvoiceDetail.dtd"> 
<cXML payloadID="123456" timestamp="2009-12-10T10:05:30-06:00"> 
    <!-- content snipped --> 
</cXML> 

Je suis en train de créer un programme simple C# pour valider le xml contre la DTD. J'ai essayé un code tel que le suivant, mais ne peut pas comprendre comment l'obtenir pour utiliser un proxy:

private static bool isValid = false; 

static void Main(string[] args) 
{ 
    try 
    { 
    XmlTextReader r = new XmlTextReader(args[0]); 
    XmlReaderSettings settings = new XmlReaderSettings(); 

    XmlDocument doc = new XmlDocument(); 

    settings.ProhibitDtd = false; 
    settings.ValidationType = ValidationType.DTD; 
    settings.ValidationEventHandler += new ValidationEventHandler(v_ValidationEventHandler); 

    XmlReader validator = XmlReader.Create(r, settings); 

    while (validator.Read()) ; 
    validator.Close(); 

    // Check whether the document is valid or invalid. 
    if (isValid) 
     Console.WriteLine("Document is valid"); 
    else 
     Console.WriteLine("Document is invalid"); 
    } 
    catch (Exception ex) 
    { 
    Console.WriteLine(ex.ToString()); 
    } 
} 

static void v_ValidationEventHandler(object sender, ValidationEventArgs e) 
{ 
    isValid = false; 
    Console.WriteLine("Validation event\n" + e.Message); 
} 

L'exception que je reçois est

System.Net.WebException: The remote server returned an error: (407) Proxy Authentication Required. 

qui se produit sur la ligne while (validator.Read()) ;

Je sais que je peux valider par rapport à une DTD localement, mais je ne veux pas changer le DOCTYPE xml puisque c'est ce que le formulaire final doit être (cette application est uniquement à des fins de diagnostic). Pour plus d'informations sur les spécifications cXML, vous pouvez aller au cxml.org.

J'apprécie toute aide.

Merci

Répondre

1

Il a été un moment que votre question, désolé si elle est un peu tard!

est ici ce qui semble être le approuvé façon de le faire:

1 - Créez votre propre assembly de proxy:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Net; 
using System.Configuration; 

namespace ProxyAssembly 
{ 
    public class MyProxy:IWebProxy 
    { 


#region IWebProxy Members 

    ICredentials IWebProxy.Credentials 
    { 
     get 
     { 
      return new NetworkCredential(ConfigurationSettings.AppSettings["googleProxyUser"],ConfigurationSettings.AppSettings["googleProxyPassword"],ConfigurationSettings.AppSettings["googleProxyDomain"]); 
     } 
     set { } 

    } 

    public Uri GetProxy(Uri destination) 
    { 
     return new Uri(ConfigurationSettings.AppSettings["googleProxyUrl"]); 
    } 

    public bool IsBypassed(Uri host) 
    { 
     return Convert.ToBoolean(ConfigurationSettings.AppSettings["bypassProxy"]); 
    } 

#endregion 
} 
} 

2 - Mettre les clés nécessaires dans votre web.config:

<add key="googleProxyUrl" value="http://proxy.that.com:8080"/> 
    <add key="googleProxyUser" value="service"/> 
    <add key="googleProxyPassword" value="BadDay"/> 
    <add key="googleProxyDomain" value="corporation"/> 
    <add key="bypassProxy" value="false"/> 

3 - Mettre dans une section defaultProxy dans votre web.config

<configuration>   
    <system.net> 
     <defaultProxy> 
      <module type="ProxyAssembly.MyProxy, ProxyAssembly"/> 
     </defaultProxy> 
    </system.net>  
</configuration> 

Maintenant, toutes les demandes de votre application passeront par le proxy. C'est TOUS les demandes - ie je ne pense pas que vous pouvez choisir d'utiliser ce programme, chaque demande de ressource va essayer de passer par le proxy! par exemple: la validation de documents XML à l'aide DTD, appels WebService, etc.

Cheers, Lance