ASP.net:获取HTTPS数据服务器端?

时间:2011-03-14 21:59:58

标签: asp.net cookies https webclient

我之前在StackOverflow上询问过如何解析我的ASP.net应用程序以编程方式下载的XML。这样,我的意思是用户访问https://www.example.com/page1.aspx。 page1.aspx的代码隐藏应该以某种方式下载并解析位于https://www.example.com/foo.xml的xml文件。

我收到了关于如何解析XML的好答案。但是,我很幸运能够从我的安全HTTPS服务器检索XML。

我正在研究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 :(得分:0)

你在哪里创建cookie?这似乎是您正在显示的代码中缺少的部分。有一个“HttpCookie”类作为System.Web名称空间的一部分,可能很有用。

答案 1 :(得分:0)

这是我最终写的解决问题的代码:

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