无法通过URL获取XML字符串,WebClient Cookie配置问题咨询
场景还原
我想用C#获取http://www.tcmb.gov.tr/kurlar/today.xml的XML内容,一开始写的代码是这样:
var client = new WebClient(); string response = client.DownloadString("http://www.tcmb.gov.tr/kurlar/today.xml");
但实际拿到的不是XML,而是一段带JS的HTML:
<html><body onload='resend();'> <script> function resend() { document.cookie="sto-idd=1954f1298f08833b; max-age=1; path=/"; window.location.reload(); } </script> </body> </html>
我试过手动加Cookie,但方法不对:
client.Headers.Add(HttpRequestHeader.Cookie,"max-age=1"); client.Headers.Add(HttpRequestHeader.Cookie,"sto-idd={some id}");
到底该怎么配置才能拿到正确的XML?
解决办法
这个网站需要先接收它返回的Cookie,再带着Cookie发起请求。WebClient默认不会自动处理Cookie,得手动配置Cookie容器,或者换用更省心的HttpClient:
方法1:WebClient + CookieContainer
using (var client = new WebClient()) { // 创建Cookie容器存储网站返回的Cookie var cookieContainer = new CookieContainer(); // 先发起一次请求,让容器自动保存网站设置的Cookie var request = (HttpWebRequest)WebRequest.Create("http://www.tcmb.gov.tr/kurlar/today.xml"); request.CookieContainer = cookieContainer; using (request.GetResponse()) { // 无需处理响应,Cookie已存入容器 } // 将容器中的Cookie转换成Header格式,添加到WebClient client.Headers.Add(HttpRequestHeader.Cookie, cookieContainer.GetCookieHeader(new Uri("http://www.tcmb.gov.tr/kurlar/today.xml"))); // 现在请求即可获取XML内容 string xmlContent = client.DownloadString("http://www.tcmb.gov.tr/kurlar/today.xml"); }
方法2:HttpClient(更简便)
HttpClient默认会自动管理Cookie,无需手动操作容器:
using (var httpClient = new HttpClient(new HttpClientHandler { UseCookies = true })) { // 先发起一次请求,让HttpClient自动接收网站Cookie await httpClient.GetAsync("http://www.tcmb.gov.tr/kurlar/today.xml"); // 再次请求即可获取XML string xmlContent = await httpClient.GetStringAsync("http://www.tcmb.gov.tr/kurlar/today.xml"); }
注意事项
- 不要手动拆分Cookie添加,网站返回的是完整的Cookie字符串,需一次性加到Header中
WebClient本身无Cookie管理能力,必须借助CookieContainer;HttpClient更适合这类需要维持会话的场景
内容的提问来源于stack exchange,提问作者maximbtw
相关产品推荐
相关产品推荐

