- 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.
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
- Chiudi completamente l'app
- Ricompila (già fatto)
- Avvia app
- Aspetta 30 secondi
- 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
- ? Pulisci cache:
Remove-Item "$env:LOCALAPPDATA\AutoBidder\WebView2" -Recurse -Force - ? Riavvia app (già compilata)
- ? Aspetta 30 secondi senza cliccare
- ? Copia log completo e inviami
Cerco specificamente:
- ?
[DEBUG] EnsureCoreWebView2Async completatasenza 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
Controls\BrowserControl.xaml- Rimosso Source propertyCore\MainWindow.WebView.cs- Init con environment custom- WebView2 Source Property
- EnsureCoreWebView2Async
?? Note Importanti
Se ancora non funziona dopo questo fix:
-
Verifica nessun altro
Source=in XAML:Select-String -Path "*.xaml" -Pattern 'Source="' -Recurse -
Verifica nessuna altra init in codice:
Select-String -Path "*.cs" -Pattern 'EnsureCoreWebView2Async' -Recurse -
Pulisci bin/obj:
Remove-Item bin, obj -Recurse -Force -
Rebuild completo:
Build ? Clean Solution Build ? Rebuild Solution