代码之家  ›  专栏  ›  技术社区  ›  Chris Dunaway

使用代理根据DTD验证XML文件。C 2

  •  1
  • Chris Dunaway  · 技术社区  · 14 年前

    我看过许多针对DTD验证XML文件的例子,但没有找到一个允许我使用代理的例子。我有一个cxml文件,如下所示(缩写为display),我希望对其进行验证:

    <?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>
    

    我正在尝试创建一个简单的C程序,以根据DTD验证XML。我尝试过以下代码,但无法确定如何让它使用代理:

    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);
    }
    

    我收到的例外是

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

    发生在线路上 while (validator.Read()) ;

    我知道我可以在本地对DTD进行验证,但我不想更改XML doctype,因为这正是最终表单所需要的(此应用程序仅用于诊断目的)。有关cXML规范的更多信息,可以转到 cxml.org .

    我感谢你的帮助。

    谢谢

    1 回复  |  直到 14 年前
        1
  •  1
  •   Lanceomagnifico    14 年前

    你问这个问题已经有一段时间了,如果有点晚了,对不起!

    这是什么似乎是 经核准的 做到这一点:

    1-创建自己的代理程序集:

    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-将所需的密钥放入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-将defaultproxy节放入web.config中

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

    现在,来自应用程序的所有请求都将通过代理。那是 所有 请求——也就是说,我不认为你可以选择在程序上使用它, 每一个 资源请求将尝试通过代理!例如:使用DTD文档、WebService调用等验证XML。

    干杯, 兰斯