Tento blog post ponímam jednak ako informáciu pre čitateľov, jednak ako možnú diskusiu k problému.
Takže k veci :
Mal som pocit, že uschovanie si nejakej menšej premennej do objektu Session a následný Response.Redirect na nejakú url kde ju vyberiem zo Session a použijem je bežný a OK spôsob ako fungovať, ak nechcem hodnotu premennej vystaviť na obdiv a pokusy na hack pre usera cez query string. Teda myslel som si to až doposiaľ. V jednej našej aplikácii však potrebujeme (resp. celkom sa hodí) preniesť cez session väčší objekt. (Aký je to väčší objekt? Rádovo MB, v každom prípade nie 4 znaky stringu). No a tu nastáva problém o ktorom som netušil. Pri použití Response.Redirect nastáva totiž ThreadAbortException. Prečo? Nuž, vraj preto, lebo sa ukončuje thread ktorým sme si vyžiadali stránku a pokračujeme na novú. Túto informáciu dostanete aj vo VS v okne Output asi v takomto tvare :
A first chance exception of type
'System.Threading.ThreadAbortException' occurred in mscorlib.dll
Čo sa teda stalo? Nastala exception ThreadAbortException aj v kóde, až na to, že redirect nastane a teda o nej ani nevieme. Vieme ju normálne chytiť v try/catch, no veľa sa nedozvieme, len toľko, že nastala mimo náš kód. Zaujímavé použiť ako druhý parameter vo volaní Redirect hodnotu false. Nuž,
nedopracujete sa síce k výnimke a váš request nepadne, no interne výnimka nastane opäť a opäť prídeme o Session. Celú. Bohužiaľ. Aj tu sú však výnimky. Aplikáciu máme nasadenú na 2 rôznych mašinách, obe majú W2k3, IIS6 a na jednej aplikácia dáta v session prenesie, na inej nie. Rozdiel by som musel vyskúmať, každopádne na všetkých dev mašinách nám tento kód padá a session maže a preto sa nechcem spoliehať na to, že na 1 z x mašín kód ide, na ostatných nie.
Všimol som si ale, že pár bajtová premená prežije. Ak si však uložíme niečo väčšie, session stratíme.
Čo teda môžeme robiť?
Po pravde neviem. Trochu som sa poohliadol po webe a došiel som na pár zaujímavých linkov :
http://support.microsoft.com/kb/312629 - údajne to tak má byť a všetko je OK. spomína sa použite false ako druhého parametru, no mne nepomáha,
http://weblogs.asp.net/bleroy/archive/2004/08/03/Don_2700_t-redirect-after-setting-a-Session-variable-_2800_or-do-it-right_2900_.aspx - rovnako aj tu je spomenuté riešenie, ktoré mne nefunguje,
http://www.csharpfriends.com/Articles/getArticle.aspx?articleID=15 - spomenuté Server.Transfer, ktoré som vyskúšal a opäť sa v Output dostavila výnimka.
Posledný pokus bol Server.Execute - popis nájdete na http://msdn.microsoft.com/en-us/library/ac8t9s7b.aspx. Pri tomto síce výnimku nedostaneme, no ani request nepresmerujeme, takže som vyčerpal všetko čo som dnes našiel na webe ale bez výsledku.
Chcem sa teda spýtať, čo robím zle? Prípadne ako to robiť tak, aby to fungovalo 
Vopred ď a prajem Vám všetkým všetko dobré do roku 2010 
Update 1:
Upravím pár informácií, ktoré som uviedol nepresne. Nepredávame si celý niekoľko MB objekt, ale len názov súboru na disku. Na začiatku PageLoad držíme v Session 3 objekty, tieto sú 2 stringy a 1 menšia štruktúra (niekoľko stringov, nič veľké). Pred Redirect-om si pridáme 4 ďalšie objekty (medzi nimi aj názov súboru a 1 ďalšiu štruktúru a teda máme v Session 7 objektov). Potom vykonáme redirect, po ňom na presmerovanej page je Session stále s rovnakým ID, no len s 3 objektami, ktoré boli v Session predtým, ako sme vstúpili na PageLoad stránky kde sa redirectovalo. Je to vcelku logické, zahodili sme všetky zmeny, ktoré sme vykonali na stránke, kde sme redirectovali. No v mojom malom sample, ktorý som si urobil som dokázal uchovať v Session objekt, ktorý som vložil a následne na ďalšom riadku redirectoval. Zvláštne.
Update 2:
V catch za Response.Redirect Session stále obsahuje 7 objektov, až v PageBase presmerovanej stránky už máme len 3. Velice zajímavé 