Maison > développement back-end > C++ > Comment générer efficacement du HTML dynamique à l'aide du navigateur Web et d'Async/Await de .NET ?

Comment générer efficacement du HTML dynamique à l'aide du navigateur Web et d'Async/Await de .NET ?

Susan Sarandon
Libérer: 2025-01-15 06:47:12
original
325 Les gens l'ont consulté

How to Efficiently Generate Dynamic HTML Using .NET's WebBrowser and Async/Await?

Utilisez le navigateur Web de .NET ou mshtml.HTMLDocument pour générer dynamiquement du code HTML

Cet article explique comment générer dynamiquement du code HTML à l'aide de la classe WebBrowser de System.Windows.Forms ou de l'interface HTMLDocument de l'assembly Microsoft HTML Object Library.

Aperçu du problème

L'utilisateur a d'abord essayé d'utiliser la classe System.Windows.Forms.WebBrowser, mais a rencontré des limitations pour obtenir le code HTML rendu. J'ai eu le même problème en essayant d'accéder au code via l'interface mshtml.HTMLDocument.

Les utilisateurs ont exclu ces méthodes et recherché des alternatives, explorant l'utilisation des propriétés du navigateur Web pour obtenir les données requises, mais reconnaissant les lacunes de cette approche.

Solution

La solution proposée combine la classe WebBrowser et la programmation async/await pour interroger efficacement les modifications dans l'instantané HTML actuel de la page tout en vérifiant la propriété WebBrowser.IsBusy. Les considérations clés incluent :

  • Utilisez une logique d'interrogation avancée pour vérifier en permanence si le HTML rendu a changé.
  • Implémentez une logique de délai d'attente si le processus de rendu de la page devient indéfini.
  • Utilisez les avantages de async/await pour simplifier la logique d'interrogation asynchrone.
  • Intégrez les contrôles des fonctionnalités du navigateur pour activer le rendu HTML5.

Mise en œuvre du code

Le code suivant illustre la méthode LoadDynamicPage de la solution encapsulée :

<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>
Copier après la connexion

Contrôle des fonctions du navigateur

Pour activer le rendu HTML5 dans Internet Explorer 10 et supérieur, utilisez les commandes de fonctionnalités du navigateur présentées ci-dessous :

<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>
Copier après la connexion

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal