HttpWebRequest返回值与浏览器不同,可能是cookie

时间:2014-07-09 09:03:36

标签: c# xml http httpwebrequest

尝试使用HttpWebRequest和以下代码在线访问XML:

HttpWebRequest webRequest = HttpWebRequest.Create("http://example.com/example.xml") as HttpWebRequest;
webRequest.CookieContainer = new CookieContainer();
HttpWebResponse webResponse = webRequest.GetResponse() as HttpWebResponse;
StreamReader sr = new StreamReader(webResponse.GetResponseStream(), Encoding.ASCII);
string data = sr.ReadToEnd();

当我浏览URL时,我可以看到XML,但可变数据包含以下内容:

<html><body><script>document.cookie='lllllll=e0b70895lllllll_e0b70895; path=/';window.location.href=window.location.href;</script></body></html>

我已检查过 webResponse.Cookies ,但它已空。

如何使用webrequest将xml导入数据变量?

1 个答案:

答案 0 :(得分:0)

你写的所有内容都是正确的。问题出在你的情况下(但它对机器人来说是一个很好的解决方案),通过Javascript添加cookie而不是HTTP响应。

document.cookie='lllllll=e0b70895lllllll_e0b70895; path=/'

这行JavaScript代码设置了cookie。因此,需要在此响应后设置代码。您可以使用CookieContainer.Add()方法轻松完成此操作。

window.location.href=window.location.href

这行代码只是刷新页面,但如果在浏览器中已经设置了cookie,那就是为什么你可以获得响应。

要获取此cookie,您需要使用正则表达式,因为我认为cookie的名称也是动态的。

所以你需要添加这样的东西:

// Catch the cookie name and value with using regex, than remove the
// characters what we only need for the regex match.

string cookieName = Regex.Match(data, "'[a-z]*").Value.Remove(0, 1);
string cookieValue = Regex.Match(data, "=[a-zA-Z0-9]*").Value.Remove(0, 1);

webRequest.CookieContainer.Add(new Cookie(cookieName,cookieValue));
webResponse = webRequest.GetResponse() as HttpWebResponse;
StreamReader sr2 = new StreamReader(webResponse.GetResponseStream(), Encoding.ASCII);
string data = sr2.ReadToEnd();