2010-09-13 11 views
10

Program ASP.NET nie zezwala na współbieżne żądania dla tej samej sesji; co oznacza, że ​​użytkownik może wykonać tylko jedno żądanie naraz.Czy można wymuszać współbieżność żądań podczas korzystania z sesji ASP.NET?

Załóżmy, że mamy Test1.aspx:

public partial class Test1 : System.Web.UI.Page 
    { 
    protected void Page_Load(object sender, EventArgs e) 
    { 
     Session["test"] = 1; 
     System.Threading.Thread.Sleep(int.Parse(Request.QueryString["timeout"])); 
    } 
    } 

... i Test2.aspx:

public partial class Test2 : System.Web.UI.Page 
    { 
    protected void Page_Load(object sender, EventArgs e) 
    { 
     Session["test"] = 1; 
     Label1.Text = DateTime.Now.ToString("dd/MM/yy HH:mm:ss"); 
    } 
    } 

Kiedy odwiedzamy Test1.aspx?timeout=10000, a następnie natychmiast po wizycie Page2.aspx, 2. wniosek będzie musiał odczekaj 10 sekund, aż zakończy się pierwsze żądanie.

Właśnie się tego nauczyłem dzisiaj i używam ASP.NET przez 5 lat! Naprawdę nie wierzyłem, dopóki nie przeczytałem go na dole strony MSDN (ASP.NET Session State Overview).

Czy istnieje sposób na wymuszenie współbieżności? Innymi słowy, niż tworzenie stron szybszych lub przenoszenie długiego kodu do wątku w tle. Jestem świadomy, że możesz ustawić sesję tylko do odczytu, ale nie jestem do końca pewien, czy jest to opcja praktyczna.

+0

wow, używam go od 1,0, a także nie wiedział, że :(Minęło Nie mam problemu z żadną aplikacją, z którą pracowałem, ale zastanawiam się, co by to zrobiło w aplikacji, która używa sesji dla czegoś, a następnie kontynuuje wysyłanie dużego pliku do pobrania do przeglądarki. flashować mnie wyłączającą sesję w procedurze obsługi plików, ponieważ planowaliśmy przenieść proces wyłączania sesji w przyszłości, zastanawiam się, jak duży byłby ból głowy, aby dowiedzieć się, dlaczego pobieranie zablokowało aplikację ... – eglasius

+0

Odtworzyć, ponieważ pytanie również było w mojej głowie.Bardzo ściśle powiązane: czy to ograniczenie współbieżności dotyczy również wywołań usługi sieciowej ASMX, w których [WebMethod (EnableSession = true)]? – mikemanne

+0

W moich testach do tej pory jest jeszcze gorszy niż opisuje Nbolton; nawet jeśli Test2 nie uzyskał dostępu/zmiany sesji, blokowałby się do zakończenia Test1. Jedynym sposobem obejścia tego problemu jest jawne ustawienie EnableSessionState = "False" jako dyrektywy strony w Test2. – Chris

Odpowiedz

3

Chociaż ja właśnie dowiedział się o tym od pytanie, powinienem sprawdzić sekcję "Przechowywanie sesji-sklep" pod numerem Implementing a Session-State Store Provider, aby uzyskać więcej informacji o tym, dlaczego tak się stało.

W związku z powyższym, naprawdę nie wydaje się dobrym pomysłem, aby spróbować obejść ten mechanizm.

Jak wspomniałeś, nie zamykaj żądań i przesuń długo działający kod z wątku żądania. Dodatkowo:

  • wyłącz sesję, jeśli jej nie potrzebujesz. Najważniejsze to zrobić, jeśli wysyłasz coś dużego w tym żądaniu.
  • unikaj niepotrzebnego korzystania z sesji.

Wszystkie te rzeczy i tak powinniście już robić.

+0

Jeśli chcesz spróbować zaimplementować niestandardowego dostawcę stanu sesji w celu obejścia tego problemu, znalazłem ten artykuł MSDN [Session State Providers] (http://msdn.microsoft.com/en-us /library/aa478952.aspx), a zwłaszcza wyjaśnienie, kiedy wywoływane są GetItem i GetItemExclusive. – Chris

1

O ile mi wiadomo, nie jest to możliwe bez utworzenia własnego dostawcy stanu sesji.

(Jeśli używasz SQL Server jako magazynu sesji to może można włamać procedur przechowywanych, aby umożliwić jednoczesne czyta, ale na pewno nie jest zalecane.)

1

Dla stron ASP.NET można spróbować zmienić wartość EnableSessionState w dyrektywie @ Page ReadOnly.

.NET Framework 4.5 dodano nowy HttpContext.SetSessionStateBehavior metodę, która może być użyta do ustawienia zachowania sesji dla całej aplikacji

Powiązane problemy