我之前在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,因此无效。
我该如何解决这个问题?
答案 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;
}