我目前正在控制台应用程序中使用.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();