首页  >  文章  >  web前端  >  使用 .NET 动态生成 HTML 代码的方法有哪些?

使用 .NET 动态生成 HTML 代码的方法有哪些?

Mary-Kate Olsen
Mary-Kate Olsen原创
2024-10-18 08:32:29809浏览

What are the Approaches to Dynamically Generate HTML Code Using .NET?

如何使用.NET和WebBrowser或mshtml.HTMLDocument动态生成HTML代码

简介

使用 .NET 动态生成 HTML 代码提供了对网页内容的灵活性和控制。本文探讨了两种检索动态 HTML 代码的方法:利用 System.Windows.Forms 中的 WebBrowser 类和利用 Microsoft HTML 对象库程序集中的 COM 接口 mshtml.HTMLDocument。

方法 1:利用WebBrowser

WebBrowser 类是加载网页和访问其内容的便捷选项。以下代码演示了如何使用 WebBrowser DocumentCompleted 事件加载页面并检索其 HTML:

<code class="csharp">WebBrowser wb = new WebBrowser();
wb.Navigate("https://www.google.com/#q=where+am+i");

wb.DocumentCompleted += delegate(object sender, WebBrowserDocumentCompletedEventArgs e)
{
    mshtml.IHTMLDocument2 doc = (mshtml.IHTMLDocument2)wb.Document.DomDocument;
    foreach (IHTMLElement element in doc.all)
    {
        System.Diagnostics.Debug.WriteLine(element.outerHTML);
    }     
};</code>

方法 2:利用 mshtml.HTMLDocument

mshtml.html 文件。 HTMLDocument 接口提供了与 HTML 文档交互的直接方式。您可以使用它从字符串加载和访问 HTML:

<code class="csharp">mshtml.IHTMLDocument2 doc = (mshtml.IHTMLDocument2)new mshtml.HTMLDocument();
doc.write(new System.Net.WebClient().DownloadString("https://www.google.com/#q=where+am+i"));

foreach (IHTMLElement e in doc.all)
{
    System.Diagnostics.Debug.WriteLine(e.outerHTML);
}</code>

WebBrowser 和 mshtml.HTMLDocument 的限制

WebBrowser 和 mshtml.HTMLDocument 方法都可能并不总是返回完全呈现的 HTML 代码。为了解决这个问题,提供了一种使用异步/等待和取消令牌的改进方法作为参考内容中的增强响应。此方法动态监视 HTML 更改并在完全呈现时检索内容。

代码示例

以下优化代码演示了改进的方法:

<code class="csharp">using Microsoft.Win32;
using System;
using System.ComponentModel;
using System.Diagnostics;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace WbFetchPage
{
    public partial class MainForm : Form
    {
        public MainForm()
        {
            SetFeatureBrowserEmulation();
            InitializeComponent();
            this.Load += MainForm_Load;
        }

        async void MainForm_Load(object sender, EventArgs e)
        {
            try
            {
                var cts = new CancellationTokenSource(10000); // cancel in 10s
                var html = await LoadDynamicPage("https://www.google.com/#q=where+am+i", cts.Token);
                MessageBox.Show(html.Substring(0, 1024) + "..." ); // it's too long!
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }

        async Task<string> LoadDynamicPage(string url, CancellationToken token)
        {
            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; // wait for DocumentCompleted
                }
                finally
                {
                    this.webBrowser.DocumentCompleted -= handler;
                }
            }

            var documentElement = this.webBrowser.Document.GetElementsByTagName("html")[0];

            var html = documentElement.OuterHtml;
            while (true)
            {
                await Task.Delay(500, token); 

                if (this.webBrowser.IsBusy)
                    continue; 

                var htmlNow = documentElement.OuterHtml;
                if (html == htmlNow)
                    break; 

                html = htmlNow;
            }

            token.ThrowIfCancellationRequested();
            return html;
        }

        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>

此代码可确保在检索 HTML 内容之前页面已完全呈现,从而获得更准确和可靠的结果。

以上是使用 .NET 动态生成 HTML 代码的方法有哪些?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn