本文探討如何使用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中文網其他相關文章!