Проверьте файл Xml на соответствие DTD с помощью прокси. C # 2.0

Я просмотрел множество примеров проверки XML-файла на соответствие DTD, но не нашел ни одного, который позволил бы мне использовать прокси. У меня есть файл cXml следующего вида (сокращенно для отображения), который я хочу проверить:

<?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 # для проверки XML на соответствие DTD. Я пробовал следующий код, но не могу понять, как заставить его использовать прокси:

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.

Я ценю любую помощь.

Спасибо


person Chris Dunaway    schedule 11.12.2009    source источник


Ответы (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>

Теперь ВСЕ запросы от вашего приложения будут проходить через прокси. Это ВСЕ запросы - то есть я не думаю, что вы можете выбрать использование этого программного обеспечения, каждый запрос ресурса будет пытаться пройти через прокси! например: проверка xml с использованием dtd docs, вызовов веб-сервисов и т. д.

Ура, Лэнс

person Lanceomagnifico    schedule 04.05.2010