Сегодня я столкнулся с той же проблемой.Я также работал с классом BrowserSession Рохита Агарвала вместе с HtmlAgilityPack.После целого дня проб и ошибок программирования я выяснил, что проблема вызвана тем, что в последующих запросах не были установлены правильные файлы cookie.Я не могу изменить исходный код BrowserSession для правильной работы, но я добавил следующие функции и немного изменил функцию SameCookieFrom.В конце концов, это хорошо сработало для меня.
Добавлены / изменены следующие функции:
class BrowserSession{
private bool _isPost;
private HtmlDocument _htmlDoc;
public CookieContainer cookiePot; //<- This is the new CookieContainer
...
public string Get2(string url)
{
HtmlWeb web = new HtmlWeb();
web.UseCookies = true;
web.PreRequest = new HtmlWeb.PreRequestHandler(OnPreRequest2);
web.PostResponse = new HtmlWeb.PostResponseHandler(OnAfterResponse2);
HtmlDocument doc = web.Load(url);
return doc.DocumentNode.InnerHtml;
}
public bool OnPreRequest2(HttpWebRequest request)
{
request.CookieContainer = cookiePot;
return true;
}
protected void OnAfterResponse2(HttpWebRequest request, HttpWebResponse response)
{
//do nothing
}
private void SaveCookiesFrom(HttpWebResponse response)
{
if ((response.Cookies.Count > 0))
{
if (Cookies == null)
{
Cookies = new CookieCollection();
}
Cookies.Add(response.Cookies);
cookiePot.Add(Cookies); //-> add the Cookies to the cookiePot
}
}
Что он делает: Он в основном сохраняет файлы cookie из первоначального «пост-ответа»и добавляет тот же CookieContainer к запросу, вызванному позже.Я не совсем понимаю, почему он не работал в начальной версии, потому что он как-то делает то же самое в функции AddCookiesTo.(if (Cookies! = null && Cookies.Count> 0) request.CookieContainer.Add (Cookies);) В любом случае, с этими добавленными функциями теперь все должно работать нормально.
Его можно использовать так:
//initial "Login-procedure"
BrowserSession b = new BrowserSession();
b.Get("http://www.blablubb/login.php");
b.FormElements["username"] = "yourusername";
b.FormElements["password"] = "yourpass";
string response = b.Post("http://www.blablubb/login.php");
все последующие вызовы должны использовать:
response = b.Get2("http://www.blablubb/secondpageyouwannabrowseto");
response = b.Get2("http://www.blablubb/thirdpageyouwannabrowseto");
...
Я надеюсь, что это поможет многим людям, сталкивающимся с той же проблемой!