Essendo l'admin non solo del mio, ma anche del blog di Silvia (mia moglie, per i lettori novelli), mi sono trovato ad affrontare una piccola rogna con l'impostazione di una variabile di sessione durante l'esecuzione dell'evento lato server Page_Load.

Il problema nasce quando tento di mettere la protezione captcha ai commenti: visto che BlogEngine.Net invia i commenti attraverso Javascript, l'unico modo di avere una variabile lato server per il confronto del captcha era impostarlo in una variabile di sessione, quindi, stringendo molto, il mio evento Page_Load assomigliava a qualcosa del genere:

protected void Page_Load(object sender, EventArgs e)
{
    ...
    myCaptchaValue = GenerateRandomString();
    Session["captchaValue"] = myCaptchaValue;
    ...
}

Ed ecco che arriva il ma: quando BE.NET renderizza le pagine dei post, genera anche questi tag nella sezione HEAD della pagina:

<link rel="last" title="Ultimo post" href="...." />
<link rel="first" title="Primo post" href="..." />
<link rel="next" title="Prossimo post" href="..." />
<link rel="prev" title="Post Precedente" href="..." />

Firefox interpreta questi tag per l'esecuzione del prefetching, ovvero carica le pagine segnalate in memoria per velocizzare la navigazione.
Il problema è che ad ogni caricamento la sessione con il valore del captcha veniva rigenerato, quindi quando un utente inseriva il captcha che vedeva a video, il risultato era sempre un ko, perchè il valore era diverso da quanto c'era nella variabile di sessione.
Grazie a dio, i browser che effettuano il prefetching inviano un particolare contenuto negli header, ovvero settano l'header HTTP-X-Moz = "prefetch".
Quindi la soluzione che ho applicato è:

protected void Page_Load(object sender, EventArgs e)
{
    if(!string.IsNullOrEmpty(Request.Headers["X-moz"]) && Request.Headers["X-moz"].Contains("prefetch")) return;
    ...
    myCaptchaValue = GenerateRandomString();
    Session["captchaValue"] = myCaptchaValue;
    ...
}

E il gioco è fatto :)