2009-12-11 65 views
1

我已經看過很多用於驗證DTD的XML文件的示例,但沒有找到允許我使用代理的示例。我有如下,我想驗證一個CXML文件(以下簡稱爲顯示屏):使用代理驗證針對DTD的Xml文件。 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> 

我想創建一個簡單的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

自從你的問題已經有一段時間了,所以很抱歉,如果有點晚!

這裏是似乎是批准辦法做到這一點:

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

乾杯, 蘭斯