在非活动的Windows会话上使用Webbrowser对象

时间:2014-12-08 10:02:39

标签: c# asp.net asp.net-web-api webbrowser-control

我目前正在控制台应用程序中使用.net WebBrowser对象导航到网页,单击按钮然后在单击该按钮后获取页面HTML。这在本地计算机上运行良好,其中控制台应用程序在活动的Windows会话中执行。

现在我想将控制台应用程序执行的功能移动到我的asp.net web api服务中。但这不起作用。当我尝试在Web服务器上运行代码时,iis进程占用所有cpu和RAM并继续这样做,直到我手动终止iis进程。

我认为没有活动的Windows会话就无法使用WebBrowser对象。我对此是否正确?

如何解决我想将控制台应用程序功能移至我的web api服务的问题?

我认为我可以使用HttpClient来调用URL,但这不起作用,因为我需要在我想要下载的HTML之前点击一个按钮。

以下是我正在使用的代码:

Log.Info("Setting up webbrowser thread.");
ThreadStart browserThreadStart = () =>
    {
        Log.Info("Staring web browser");
        using (var browser = new WebBrowser { ScriptErrorsSuppressed = true })
        {
            Log.Info("Go to URL.");
            browser.Navigate(Url);

            Log.Info("Wait for browser");
            WaitForBrowser(browser); // <-- Here the IIS process on the webserver goes crazy on CPU and RAM

            Log.Info("Click button");
            //Added this line, because the final HTML takes a while to show up
            var isCheckbox = browser.Document.GetElementById("buttonid");
            isCheckbox.InvokeMember("click");

            Log.Info("Wait for browser");
            WaitForBrowser(browser);

            Log.Info("Return html");
            result = browser.Document.Body.InnerHtml;
        }
    };

Log.Info("Starting thread for webbrowser.");
var browserThread = new Thread(browserThreadStart);
browserThread.SetApartmentState(ApartmentState.STA);
browserThread.Start();
browserThread.Join();

0 个答案:

没有答案