2010-09-13 5 views
10

ASP.NET aynı oturum için eşzamanlı isteklere izin vermiyor; Bir kullanıcının bir seferde sadece 1 istekte bulunabileceği anlamına gelir. Örneğin ASP.NET oturumları kullanırken eşzamanlılık isteğini zorlamak mümkün mü?

biz Test1.aspx olduğunu varsayalım:

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"])); 
    } 
    } 

... ve 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"); 
    } 
    } 

biz Test1.aspx?timeout=10000 ziyaret edin ve sonra hemen ziyarette Page2.aspx sonra, 2 isteği zorunda kalacak

İlk istek tamamlanana kadar 10 saniye bekleyin.

Bugün bunu öğrendim ve ASP.NET'i 5 yıldır kullanıyorum! Bir MSDN sayfasının (ASP.NET Session State Overview) en altında okuyana kadar gerçekten inanamadım.

Eşzamanlılığı zorlamanın bir yolu var mı? Diğer bir deyişle, sayfaları daha hızlı yapmak ya da uzun koşulan kodu arka plan iş parçacığına taşımaktan başka. Sadece oturumu okuyabileceğinin farkındayım, fakat bunun pratik bir seçenek olduğundan emin değilim.

+0

vay, 1.0 beri kullanıyorum tüm Uygulamaya Oturum davranışını ayarlamak için kullanılabilir ve ayrıca kadar oldu :(bilmiyordum yeni HttpContext.SetSessionStateBehavior yöntemi eklendi Çalıştığım uygulamaların hiçbirinde sorun değil, ama bir şey için oturumu kullanan ve daha sonra tarayıcıya büyük bir indirme dosyası göndermeye devam eden bir uygulamada ne yapılacağını merak ediyorum. Bir dosya işleyicide oturumu devre dışı bırakmamı arkamda beklediğimizden, gelecekte oturumun ilerlemesini planlamayı planladığımızda, baş ağrısının neden indirme uygulamasını engellediğini merak ediyorum ... – eglasius

+0

Bundan böyle olumlu Benim de aklımın arkasında soru vardı.Çok yakından ilişkili: bu eşzamanlılık kısıtlaması aynı zamanda ASMX web servis çağrıları için de geçerlidir [WebMethod (EnableSession = true)]? – mikemanne

+0

Testlerimde şimdiye kadar nbolton daha da beterdi; Test2 Session'a erişemediyse/değiştiremese bile, Test1 bitene kadar hala bloke olur. Bu konuda çalışabileceğim tek yol, Test2'de EnableSessionState = "False" öğesini bir Sayfa yönergesi olarak açıkça belirlemektir. – Chris

cevap

3

sorusu, neden yapıldığına dair daha fazla bilgi için Implementing a Session-State Store Provider numaralı telefondaki Kilitleme Oturum Deposu Verilerini kontrol etmeyi tercih ederim. Yukarıdakilere dayanarak, bu mekanizma etrafında çalışmayı denemek iyi bir fikir gibi görünmemektedir.

Bahsettiğiniz gibi, istekleri kısa tutun ve uzun süren kodları istek iş parçacığının dışına taşıyın. Ayrıca, gerekmiyorsa oturumu devre dışı bırakmak için

  • oturumunu devre dışı bırakın. En önemlisi, bu istekte büyük bir şey gönderiyorsanız bunu yapabilirsiniz.
  • oturumun gereksiz kullanımını önler.

Bunların hepsi zaten zaten yapmanız gereken bir şeydir.

+0

Bunu yapmak için özel bir Oturum Durumu Sağlayıcısı'nı uygulamak istiyorsanız, bu MSDN makalesini [Oturum Durumu Sağlayıcıları] (http://msdn.microsoft.com/en-us) buldum. /library/aa478952.aspx), özellikle GetItem ve GetItemExclusive öğelerinin ne zaman çağrıldığını açıklığa kavuşturuyor. – Chris

1

Bildiğim kadarıyla, bu sizin kendi oturum durumu sağlayıcınızı oluşturmadan mümkün değildir. Sadece ögrendik rağmen

(eğer o zaman eşzamanlı okur izin saklı prosedürler kesmek mümkün olabilir oturumunuz deposu olarak SQL Server kullanan, ama kesinlikle tavsiye edilmez ediyorsanız.)

1

ASP.NET Sayfaları için, @ Sayfa yönergesi ReadOnly içinde EnableSessionState değerini değiştirmeyi deneyebilirsiniz.

.NET Framework 4.5