Files
Mimante/Mimante/Documentation/FIX_WEBVIEW_ALREADY_INITIALIZED.md
Alberto Balbo 6795282993 Migliorato auto-login e gestione cookie WebView2
- Introdotto il pre-caricamento di WebView2 per ridurre i tempi di attesa.
- Implementato il pattern TaskCompletionSource per attendere l'inizializzazione di WebView2 (timeout 60s).
- Centralizzata la logica di verifica e importazione automatica dei cookie.
- Mostrate istruzioni di login solo se necessario, migliorando l'UX.
- Risolti problemi di timeout e threading durante l'inizializzazione di WebView2.
- Puliti e ottimizzati i log per maggiore chiarezza.
- Rimossa la gestione manuale dei cookie, ora automatizzata.
2025-11-25 11:33:50 +01:00

7.5 KiB

?? Fix: WebView2 Already Initialized Error

?? Problema

Log Errore

[18:47:29] [ERROR] Inizializzazione WebView2 fallita: 
WebView2 was already initialized with a different CoreWebView2Environment. 
Check to see if the Source property was already set or 
EnsureCoreWebView2Async was previously called with different values.

[18:47:29] [DEBUG] Exception type: ArgumentException

Root Cause

XAML stava inizializzando automaticamente WebView2:

<!-- ? PROBLEMA: Source inizializza WebView con environment default -->
<wv2:WebView2 x:Name="EmbeddedWebView" 
              Source="https://it.bidoo.com"  ? Inizializzazione automatica!
              .../>

Sequenza Eventi (PRIMA ?):

1. XAML carica ? WebView2 vede Source="https://..."
2. WebView2 auto-init con CoreWebView2Environment.Default
3. InitializeWebView2() chiama EnsureCoreWebView2Async(customEnv)
4. ? ArgumentException: Already initialized with different environment!

? Soluzione

Rimuovere Source da XAML e gestire init completamente via codice.

File: Controls\BrowserControl.xaml

BEFORE ?

<wv2:WebView2 x:Name="EmbeddedWebView" 
              Source="https://it.bidoo.com"  ? ? Causa init automatica
              PreviewMouseRightButtonUp="..."/>

AFTER ?

<wv2:WebView2 x:Name="EmbeddedWebView" 
              PreviewMouseRightButtonUp="..."/>  ? ? Nessuna init automatica

?? Flusso Corretto

Dopo il Fix ?

1. XAML carica ? WebView2 NON inizializzata (nessun Source)
2. MainWindow() constructor ? InitializeWebView2()
3. CreateAsync(userDataFolder) ? Crea environment personalizzato
4. EnsureCoreWebView2Async(env) ? Init con environment custom ?
5. Navigate("https://it.bidoo.com") ? Carica pagina via codice

?? Benefici

Aspetto Prima ? Dopo ?
Init Source XAML (automatico) Codice (controllato)
Environment Default (auto) Custom (esplicito)
UserDataFolder Auto-detect (problematico) Esplicito (sicuro)
Timing Immediato (prima del codice) Controllato (quando vogliamo)
Errore ArgumentException Nessuno

?? Test Richiesto

Step 1: Pulisci Cache

# Rimuovi vecchia cache WebView
Remove-Item "$env:LOCALAPPDATA\AutoBidder\WebView2" -Recurse -Force -ErrorAction SilentlyContinue

Step 2: Riavvia App

  1. Chiudi completamente l'app
  2. Ricompila (già fatto)
  3. Avvia app
  4. Aspetta 30 secondi
  5. Osserva log

Step 3: Verifica Log

Log Atteso ?:

[18:47:28] [BROWSER] Inizializzazione WebView2 in background...
[18:47:29] [DEBUG] Chiamata EnsureCoreWebView2Async...
[18:47:29] [DEBUG] UserDataFolder: C:\Users\...\AutoBidder\WebView2
[18:47:29] [DEBUG] CoreWebView2Environment creato
[18:47:29] [DEBUG] EnsureCoreWebView2Async completata  ? ? NESSUN ERRORE!
[18:47:29] [DEBUG] CoreWebView2 disponibile, navigating...
[18:47:29] [BROWSER] WebView2 inizializzato e pre-caricato
[18:47:29] [DEBUG] Notifica WebView pronta (TrySetResult)
[18:47:29] [DEBUG] Inizio CheckAndImportCookieIfAvailable
[18:47:30] [DEBUG] CheckAndImportCookieIfAvailable - inizio
[18:47:31] [DEBUG] Delay 1000ms completato, chiamo GetCookieFromWebView
[18:47:32] [DEBUG] GetCookieFromWebView ritornato, cookie presente: True
[18:47:32] [BROWSER] Cookie rilevato - importazione automatica...
[18:47:33] [SESSION OK] Validata e attiva: sirbietole23, XX puntate

NON Deve Comparire ?:

[ERROR] Inizializzazione WebView2 fallita: WebView2 was already initialized...

?? Checklist

  • Rimosso Source="https://it.bidoo.com" da XAML
  • WebView2 init gestita completamente via codice
  • Environment custom con UserDataFolder esplicito
  • Navigate chiamato via codice dopo init
  • Test con cache pulita (da fare)
  • Verifica auto-login funzionante (da fare)

?? Perché Succedeva

XAML Source Property

In WPF, quando imposti Source su un controllo WebView2 in XAML:

<wv2:WebView2 Source="https://..." />

Dietro le quinte:

// WPF chiama automaticamente (internamente)
await webView.EnsureCoreWebView2Async(null);  // null = environment default
webView.CoreWebView2.Navigate(Source);

Problema: Quando poi noi chiamiamo:

var env = await CoreWebView2Environment.CreateAsync(...);  // Environment custom
await webView.EnsureCoreWebView2Async(env);  // ? Already initialized!

Soluzione: Rimuovi Source da XAML, gestisci tutto via codice:

// Prima init con environment custom
var env = await CoreWebView2Environment.CreateAsync(...);
await webView.EnsureCoreWebView2Async(env);  // ? Prima chiamata

// Poi navigate
webView.CoreWebView2.Navigate("https://...");

?? Pattern Corretto

? Anti-Pattern (Causa Errore)

<!-- XAML -->
<wv2:WebView2 Source="https://site.com"/>  ? Init automatica

<!-- C# -->
var env = CreateAsync(...);  // Troppo tardi!
await webView.EnsureCoreWebView2Async(env);  // ? Exception

? Pattern Corretto

<!-- XAML -->
<wv2:WebView2 x:Name="WebView"/>  ? Nessuna init

<!-- C# -->
var env = await CreateAsync(...);
await WebView.EnsureCoreWebView2Async(env);  // ? Prima chiamata
WebView.CoreWebView2.Navigate("https://site.com");  // ? Navigate via codice

?? Risultato Atteso

Ora il Flow è:

Avvio App
  ?
XAML carica (WebView2 NON inizializzata)
  ?
MainWindow() constructor
  ?
InitializeWebView2() (async background)
  ?
await CoreWebView2Environment.CreateAsync(customUserDataFolder)
  ? [2-3 secondi]
  ?
await EnsureCoreWebView2Async(env)  ? ? Prima e unica chiamata!
  ?
CoreWebView2.Navigate("https://it.bidoo.com")
  ?
CheckAndImportCookieIfAvailable()
  ?
GetCookieFromWebView() ? Cookie trovato
  ?
ValidateAndActivateSessionAsync()
  ?
[SESSION OK] Connesso!

?? Prossimi Passi

  1. ? Pulisci cache: Remove-Item "$env:LOCALAPPDATA\AutoBidder\WebView2" -Recurse -Force
  2. ? Riavvia app (già compilata)
  3. ? Aspetta 30 secondi senza cliccare
  4. ? Copia log completo e inviami

Cerco specificamente:

  • ? [DEBUG] EnsureCoreWebView2Async completata senza errori
  • ? [DEBUG] GetCookieFromWebView ritornato, cookie presente: True
  • ? [SESSION OK] Validata e attiva

NON deve esserci:

  • ? [ERROR] ... already initialized ...
  • ? [WARN] Timeout attesa inizializzazione

Data Fix: 2025
Versione: 7.2+
Issue: ArgumentException - WebView already initialized
Root Cause: XAML Source property inizializza WebView prima del codice
Soluzione: Rimosso Source da XAML, init completamente gestita via codice
Status: ? Fix applicato, test richiesto

?? Riferimenti


?? Note Importanti

Se ancora non funziona dopo questo fix:

  1. Verifica nessun altro Source= in XAML:

    Select-String -Path "*.xaml" -Pattern 'Source="' -Recurse
    
  2. Verifica nessuna altra init in codice:

    Select-String -Path "*.cs" -Pattern 'EnsureCoreWebView2Async' -Recurse
    
  3. Pulisci bin/obj:

    Remove-Item bin, obj -Recurse -Force
    
  4. Rebuild completo:

    Build ? Clean Solution
    Build ? Rebuild Solution