Geçerli ASP.NET oturumu boşsa ne yapmalıyım?


125

Web uygulamamda, oturum değişkenlerini okumak için şöyle bir şey yapıyorum:

if (HttpContext.Current.Session != null &&  HttpContext.Current.Session["MyVariable"] != null)
{
    string myVariable= (string)HttpContext.Current.Session["MyVariable"];
}

HttpContext.Current.Session ["MyVariable"] 'ın neden boş olduğunu kontrol etmenin neden önemli olduğunu anlıyorum (değişken Oturumda henüz depolanmamış olabilir veya Oturum çeşitli nedenlerle sıfırlanmış olabilir), ama neden kontrol etmem gerekiyor? boşsa HttpContext.Current.Session?

Anladığım kadarıyla oturum ASP.NET tarafından otomatik olarak oluşturulur, bu nedenle HttpContext.Current.Session asla boş olmamalıdır. Bu varsayım doğru mu? Boş olabilirse, içine bir şey kaydetmeden önce onu da kontrol etmem gerektiği anlamına mı geliyor:

if (HttpContext.Current.Session != null)
{
    HttpContext.Current.Session["MyVariable"]="Test";
}
else
{
    // What should be done in this case (if session is null)?
    // Is it possible to force the session to be created if it doesn't exist?
}

ASP.NET WebApi'nin farklı bir davranışı olacaktır, bunu ASP.NET Web API Kullanarak Oturuma Erişim'de
Tiago Gouvêa

Yanıtlar:


158

Evet, Oturum nesnesi boş olabilir, ancak yalnızca nadiren karşılaşacağınız belirli durumlarda:

Yalnızca sayfalarda kodunuz varsa, bununla karşılaşmazsınız. ASP .NET kodumun çoğu, null olup olmadığını tekrar tekrar kontrol etmeden Session kullanıyor. Bununla birlikte, bir IHttpModule geliştiriyorsanız veya başka bir şekilde ASP .NET'in daha cesur detaylarında mı düşünmeniz gereken bir şeydir.

Düzenle

Yoruma yanıt olarak: Oturum durumunun kullanılabilir olup olmadığı, AcquireRequestState olayının istek için çalıştırılıp çalıştırılmadığına bağlıdır. Bu, oturum durumu modülünün oturum tanımlama bilgisini okuyarak ve sizin için uygun oturum değişkenleri kümesini bularak çalışmasını sağladığı yerdir.

AcquireRequestState, kontrol Sayfanıza teslim edilmeden önce çalışır. Dolayısıyla, sayfanızdan statik sınıflar da dahil olmak üzere diğer işlevleri arıyorsanız, sorun yaşamamalısınız.

Başlatma sırasında başlatma mantığı yapan bazı sınıflarınız varsa, örneğin Application_Start olayında veya statik bir kurucu kullanarak, Oturum durumu kullanılamayabilir. Her şey geçerli bir istek olup olmadığına ve AcquireRequestState'in çalıştırılıp çalıştırılmadığına bağlıdır.

Ayrıca, istemcinin çerezleri devre dışı bırakması durumunda, Oturum nesnesi hala kullanılabilir durumda olacaktır - ancak bir sonraki istekte kullanıcı yeni bir boş Oturum ile geri dönecektir. Bunun nedeni, müşteriye henüz oturum durumu yoksa bir Oturum durum çantası verilmesidir. Müşteri oturum tanımlama bilgisini taşımazsa, istemciyi aynı şekilde tanımlamanın bir yolu yoktur, bu nedenle kendisine tekrar tekrar yeni bir oturum verilecektir.


6
Bugün bulduğum hızlı bir güncelleme. Oturum, sayfa yapıcısında mevcut değil! Yalnızca Init olayında veya ondan sonra.
Nuno Agapito

Az önce bir HttpContext.Current.Session == null ile karşılaştım, ana sayfanın Page_Load olayı tarafından çağrılan koddur. Görünüşe göre, bu olabilir bir sayfa bağlamında ortaya çıkar. HttpContext.Current nesnesini incelersem, üyelerinin çoğu başlatılır, ancak CurrentNotification ve IsPostNotification bir hata verir: {System.PlatformNotSupportedException}. Nedeni ne olursa olsun, bu sorun yıllardır devam ettiği üretimde gerçekleşmedi. Platform Windows Server 2003 R2 SP2'dir, uygulama .Net 3.5 hedef çerçevesine sahiptir ve IIS'de oturum durumu etkin olarak çalışır.
R. Schreurs

Ayrıca, IIS, bir stil sayfası gibi diskte bulunan bir kaynak dosyası için doğrudan bir istek sunduğunda, HttpContext.Current.SessionApplication_AcquireRequestState'deki kod için boş olabileceğini buldum . Bununla birlikte, sayfanın kendisine yönelik istek, oturum nesnesini orada kodlamak için kullanılabilir hale getirir. Bu en azından MVC.NET 4 altında.
ingredient_15939

Bence çıktı önbelleğe alınmış bir MVC eyleminin içindeyseniz de boş olabilir.
user2173353

40

Aşağıdaki ifade tamamen doğru değildir:

"Dolayısıyla, sayfanızdan statik sınıflar dahil olmak üzere diğer işlevleri arıyorsanız, sorun yaşamazsınız."

Oturuma HttpContext.Current.Session aracılığıyla başvuran statik bir yöntem çağırıyorum ve bu boş. Ancak, yöntemi jQuery kullanarak ajax üzerinden bir web hizmeti yöntemi ile çağırıyorum.

Öğrendiğim gibi burada sen yöntem üzerinde basit bir özelliği olan sorunu çözmek veya web hizmeti oturum nesnesi kullanabilirsiniz:

Yine de bir numara var, bir web yönteminde oturum durumuna erişmek için, oturum durumu yönetimini şu şekilde etkinleştirmelisiniz:

[WebMethod (EnableSession = true)]

EnableSession değerini belirterek, artık oynamak için yönetilen bir oturuma sahip olacaksınız. Bu değeri belirtmezseniz, boş bir Session nesnesi alırsınız ve büyük olasılıkla oturum nesnesine erişmeye çalışırken boş referans istisnaları ile karşılaşırsınız.

Çözüm için Matthew Cozier'e teşekkürler.

Sadece iki sentimi eklerim diye düşündüm.

Ed


1
teşekkürler Ed, Session web yönteminde boş görünüyordu - bunu eklemek sorunu çözdü. +1
fusi

1
Eh, bir web servisini aradığınızda, sayfadan başka bir istek kullanırsınız, böylece bu ifade hala doğru, IMO.
18'de driis

MSDN belgeleri burada - the default value is false. Tıkır tıkır çalışıyor.
Benjineer

22

Oturum örneğiniz boşsa ve bir 'ashx' dosyasındaysanız, 'IRequiresSessionState' arayüzünü uygulamanız yeterlidir.

Bu arayüzde herhangi bir üye bulunmadığından, arayüz adını sınıf bildiriminden (C #) sonra eklemeniz yeterlidir:

public class MyAshxClass : IHttpHandler, IRequiresSessionState

Çok teşekkür ederim, oturum açma sınıfımda oturum boştu. Bu kodu ashx işleyicime eklediğimde sınıfımda da oturum açtı
Ateş Danış

Bunun soruyu oldukça iyi yanıtladığını düşünüyorum. Çok teşekkürler.
Sachin Joseph

2

ASP.NET Teknik Makaleleri

Hepsini kapa Özet: ASP.NET'te, her Web sayfası System.Web.UI.Page sınıfından türetilir. Sayfa sınıfı, oturum verileri için HttpSession nesnesinin bir örneğini toplar. Sayfa sınıfı, özelleştirme için farklı olayları ve yöntemleri gösterir. Özellikle, OnInit yöntemi, Page nesnesinin başlatma durumunu ayarlamak için kullanılır. İstekte Oturum çerezi yoksa, talepte bulunan kişiye yeni bir Oturum çerezi gönderilir.

DÜZENLE:

Oturum: Yeni Başlayanlar İçin Bir Konsept

ÖZET: Oturum, kullanıcı web uygulamasındaki herhangi bir sayfa için sunucuya bir ilk istek gönderdiğinde, uygulama Oturumu oluşturduğunda ve Oturum Kimliğini yanıtla kullanıcıya geri gönderdiğinde ve istemci makinede küçük bir çerez olarak saklandığında oluşturulur. . Dolayısıyla ideal olarak "çerezleri devre dışı bırakan makine, oturum bilgileri saklanmayacaktır".


2

Benim durumumda ASP.NET State Servicedurduruldu. Değişen Startup typeiçin Automaticve ilk kez hizmete el başlangıç sorunu çözüldü.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.