本文探讨如何使用System.Windows.Forms的WebBrowser类或Microsoft HTML对象库程序集的HTMLDocument接口动态生成HTML代码。
用户最初尝试使用System.Windows.Forms.WebBrowser类,但在获取渲染后的HTML代码时遇到限制。尝试通过mshtml.HTMLDocument接口访问代码也遇到了同样的问题。
用户排除了这些方法,并寻求替代方案,探索使用WebBrowser的属性来获取所需数据,但承认这种方法的不足。
提出的解决方案结合了WebBrowser类和async/await编程,以高效地轮询页面当前HTML快照中的更改,同时检查WebBrowser.IsBusy属性。关键考虑因素包括:
以下代码演示了封装解决方案的LoadDynamicPage方法:
<code class="language-csharp">async Task<string> LoadDynamicPage(string url, CancellationToken token) { // 导航和DocumentCompleted事件处理 var tcs = new TaskCompletionSource<bool>(); WebBrowserDocumentCompletedEventHandler handler = (s, arg) => tcs.TrySetResult(true); using (token.Register(() => tcs.TrySetCanceled(), useSynchronizationContext: true)) { this.webBrowser.DocumentCompleted += handler; try { this.webBrowser.Navigate(url); await tcs.Task; // 等待DocumentCompleted } finally { this.webBrowser.DocumentCompleted -= handler; } } // 获取根元素 var documentElement = this.webBrowser.Document.GetElementsByTagName("html")[0]; // 异步轮询当前HTML更改 var html = documentElement.OuterHtml; while (true) { // 异步等待 await Task.Delay(500, token); // 如果WebBrowser繁忙,则继续轮询 if (this.webBrowser.IsBusy) continue; var htmlNow = documentElement.OuterHtml; if (html == htmlNow) break; // 未检测到更改,结束轮询循环 html = htmlNow; } // 认为页面已完全渲染 token.ThrowIfCancellationRequested(); return html; }</code>
要在Internet Explorer 10及更高版本中启用HTML5渲染,请使用如下所示的浏览器功能控制:
<code class="language-csharp">private static void SetFeatureBrowserEmulation() { if (LicenseManager.UsageMode != LicenseUsageMode.Runtime) return; var appName = System.IO.Path.GetFileName(System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName); Registry.SetValue(@"HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_BROWSER_EMULATION", appName, 10000, RegistryValueKind.DWord); }</code>
以上是如何使用.NET的WebBrowser和Async/Await高效生成动态HTML?的详细内容。更多信息请关注PHP中文网其他相关文章!