0

我前段时间问过这个问题,但似乎没有答案,所以我尝试使用替代解决方案,但我现在卡住了,请参阅以下代码:

        WebBrowser objWebBrowser = new WebBrowser();
        objWebBrowser.DocumentCompleted += new WebBrowserDocumentCompletedEventHandler(objWebBrowser_DocumentCompleted);
        objWebBrowser.Navigate("http://www.website.com/login.php?user=xxx&pass=xxx");
        objWebBrowser.Navigate("http://www.website.com/page.php?link=url");

这是事件代码:

        WebBrowser objWebBrowser = (WebBrowser)sender;
        String data = new StreamReader(objWebBrowser.DocumentStream).ReadToEnd();

由于在加载文档之前我无法使用 WebBrowser.Document.Cookies,因此我必须首先导航登录页面,该页面将自动存储 cookie,但之后我想调用另一个导航以获得结果。现在使用上面的代码它不起作用,因为它总是需要第二个代码,而且我无法将它放入事件中,因为我想要的是这样的:

  • 使用登录页面导航并仅存储一次 cookie。
  • 每次我想得到一些结果时传递一个不同的 url。

任何人都可以给出解决方案吗?

编辑:

也许我提供的代码示例具有误导性,我想要的是:

foreach(url in urls)
{
  Webborwser1.Navigate(url);
  //Then wait for the above to complete and get the result from the event, then continue
}
4

1 回答 1

0

如果您未获得授权,我认为您想模拟对 Navigate 的阻塞调用。可能有很多方法可以完成此操作以及其他方法来获得您想要的东西,但这里有一些我快速编写的代码可能会帮助您入门。

如果您对我在这里尝试做的事情有任何疑问,请告诉我。我承认这感觉就像“黑客”,这让我觉得有一个更聪明的解决方案,但无论如何......

bool authorized = false;
bool navigated;
WebBrowser objWebBrowser = new WebBrowser();
void GetResults(string url)
{
    if(!authorized)
    {
        NavigateAndBlockWithSpinLock("http://www.website.com/login.php?user=xxx&pass=xxx");
        authorized = true;
    }
    objWebBrowser.Navigate(url);
}

void NavigateAndBlockWithSpinLock(string url)
{
    navigated = false;

    objWebBrowser.DocumentCompleted += NavigateDone;

    objWebBrowser.Navigate(url);

    int count = 0;
    while(!navigated && count++ < 10)
        Thread.Sleep(1000);

    objWebBrowser.DocumentCompleted -= NavigateDone;

    if(!navigated)
        throw new Exception("fail");
}

void NavigateDone(object sender, WebBrowserDocumentCompletedEventArgs e)
{
    navigated = true;
}

void objWebBrowser_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{
    if(authorized)
    {
        WebBrowser objWebBrowser = (WebBrowser)sender;
        String data = new StreamReader(objWebBrowser.DocumentStream).ReadToEnd();
    }
}
于 2013-01-28T08:24:51.787 回答