А на мой взгляд, тут банальное race condition. Когда мы зажимаем F5, несколько запросов теоретически могут одновременно попасть в конвейер обработки.
Попробуйте поместить указанные операции в критическую секцию:
lock (Session.SyncRoot) {
if (Session["a"] == null)
Session["a"] = a;
else {
Session["a"] = (int)Session["a"] + 1;
a = (int)Session["a"];
}
}
И я бы сделал так, а то у вас три операции чтения, хотя нужна только одна:
var storedValue = Session["a"];
a = (storedValue == null) ? a : (int)storedValue + 1;
Session["a"] = a;