ASP.net: Получение данных HTTPS на стороне сервера? - PullRequest
1 голос
/ 15 марта 2011

Ранее я спрашивал в StackOverflow, как анализировать XML, загруженный программно моим приложением ASP.net. Под этим я подразумеваю, что пользователь посещает https://www.example.com/page1.aspx. Кодовый код для page1.aspx должен каким-то образом загружать и анализировать XML-файл, расположенный по адресу https://www.example.com/foo.xml.

Я получил хорошие ответы о том, как анализировать XML. Однако мне не повезло с возможностью извлечения XML с моего безопасного HTTPS-сервера.

Я смотрю на ситуацию, когда https://www.example.com/foo.xml аутентифицирует запросы с помощью cookie. (сторонняя система, а не проверка подлинности с помощью форм). Ответ, который я получил на мой вопрос о том, как загрузить и проанализировать XML, предложил мне использовать класс System.Net.WebClient. Я прочитал, что класс WebClient должен быть настроен для работы с файлами cookie. Поэтому я написал следующий код:

public class WebClientWithCookies : WebClient
{
    private CookieContainer m_container = new CookieContainer();

    public CookieContainer CookieContainer
    {
        get { return m_container; }
        set { m_container = value; }
    }

    public void addCookie(Cookie cookie)
    {
        m_container.Add(cookie);
    }

    protected override WebRequest GetWebRequest(Uri address)
    {
      WebRequest request = base.GetWebRequest(address);
        if ( request is HttpWebRequest)
        {
            (request as HttpWebRequest).CookieContainer = m_container;
        }
        return request;
    }
} // end class

Однако, когда запрос получен на https://www.example.com/foo.xml,, в запросе нет файлов cookie, и он не работает.

Как обойти эту проблему?

Ответы [ 2 ]

0 голосов
/ 21 марта 2011

Вот код, который я в конце концов написал, который решил проблему:

    private XmlDocument getXmlData(string url)
    {
        System.Net.HttpWebRequest rq = (System.Net.HttpWebRequest)System.Net.WebRequest.Create(url);
        System.Net.CookieContainer container = new System.Net.CookieContainer();

        for (int i = 0; i < System.Web.HttpContext.Current.Request.Cookies.Count; i++)
        {
            System.Web.HttpCookie httpcookie = System.Web.HttpContext.Current.Request.Cookies[i];
            string name = httpcookie.Name;
            string value = httpcookie.Value;
            string path = httpcookie.Path;
            string domain = "my.domain";
            System.Net.Cookie cookie = new System.Net.Cookie(name, value, path, domain);
            container.Add(cookie);
        }

        rq.CookieContainer = container;
        rq.Timeout = 10000;
        rq.UserAgent = "Asset Tracker Server Side Code";

        System.Net.HttpWebResponse rs = (System.Net.HttpWebResponse)rq.GetResponse();

        System.Text.Encoding enc = System.Text.Encoding.GetEncoding(1252);

        System.IO.StreamReader reader = new System.IO.StreamReader(rs.GetResponseStream());

        System.Xml.XmlDocument xml = new System.Xml.XmlDocument();
        xml.Load(rs.GetResponseStream());
        return xml;
    }
0 голосов
/ 15 марта 2011

Где вы создаете куки? Это кажется отсутствующей частью кода, который вы отображаете. Существует класс " HttpCookie ", который может быть полезен как часть пространства имен System.Web.

...