Właśnie odkryłem, że każde żądanie w aplikacji sieci web ASP.Net otrzymuje blokadę sesji na początku żądania, a następnie zwalnia je na końcu żądania!
W przypadku, gdy konsekwencje tego zostaną dla ciebie utracone, tak jak na początku dla mnie, oznacza to w zasadzie:
Za każdym razem, gdy strona ASP.Net ładuje się długo (być może z powodu powolnego wywołania bazy danych lub cokolwiek innego), a użytkownik decyduje, że chce przejść do innej strony, ponieważ ma dość czekania, NIE MOGĄ! Blokada sesji ASP.Net zmusza nowe żądanie strony do czekania, aż oryginalne żądanie zakończy się boleśnie powolnym ładowaniem. Arrrgh.
Za każdym razem, gdy UpdatePanel ładuje się powoli, a użytkownik decyduje się przejść do innej strony, zanim UpdatePanel zakończy aktualizację ... NIE MOGĄ! Blokada sesji ASP.net zmusza nowe żądanie strony do czekania, aż oryginalne żądanie zakończy się boleśnie powolnym ładowaniem. Double Arrrgh!
Jakie są więc opcje? Do tej pory wymyśliłem:
- Zaimplementuj niestandardowy SessionStateDataStore, który obsługuje ASP.Net. Nie znalazłem zbyt wielu do skopiowania i wydaje się to dość ryzykowne i łatwe do zepsucia.
- Śledź wszystkie żądania w toku, a jeśli żądanie pochodzi od tego samego użytkownika, anuluj pierwotne żądanie. Wydaje się to trochę ekstremalne, ale zadziałałoby (tak myślę).
- Nie używaj sesji! Kiedy potrzebuję jakiegoś stanu dla użytkownika, mógłbym po prostu użyć pamięci podręcznej zamiast tego i wprowadzić kluczowe elementy w uwierzytelnionej nazwie użytkownika lub coś w tym rodzaju. Znowu wydaje się to ekstremalne.
Naprawdę nie mogę uwierzyć, że zespół ASP.Net Microsoft pozostawiłby tak ogromne wąskie gardło w zakresie wydajności w wersji 4.0! Czy brakuje mi czegoś oczywistego? Jak trudno byłoby użyć kolekcji ThreadSafe do sesji?