Es ist klarstellbar, dass Sie sich bei der Aussage "Sitzung" auf System.Web.UI.Page.Session beziehen. Das Sitzungsobjekt ist im Kontext der ASP.NET-Seite verfügbar.
Llyle
Antworten:
111
Ein bisschen spät hier, aber hier ist etwas, das ich gerade entdeckt habe.
@Phillipe Leybaert und @CSharpAtl sind beide falsch. HttpApplicationDie SessionImmobilie zeigt ein anderes Verhalten als die Immobilie HttpContext.Current.Session. Beide geben einen Verweis auf dieselbe HttpSessionStateInstanz zurück falls einer verfügbar ist. Sie unterscheiden sich darin, was sie tun, wenn HttpSessionStatefür die aktuelle Anforderung keine Instanz verfügbar ist.
Nicht alle HttpHandlers bieten den Sitzungsstatus. Dazu HttpHandlermuss der [eine oder beide?] Die Marker-Schnittstellen implementieren IRequiresSessionStateoderIReadOnlySessionState .
HttpContext.Current.Session kehrt einfach zurück null wenn keine Sitzung verfügbar ist.
Die HttpApplicationImplementierung der SessionEigenschaft durch wirft eine HttpExceptionNachricht mitSession state is not available in this context. anstatt eine nullReferenz zurückzugeben.
Einige Beispiele dafür, HttpHandlerdass keine Sitzung implementiert wird, sind die Standardhandler für normalerweise statische Ressourcen wie Bild- und CSS-Dateien. Jeder Verweis auf die Eigenschaft des HttpApplication's Sessionin solchen Fällen (wie in global.asaxEreignishandlern) führt dazu, dass ein HttpExceptionWurf ausgelöst wird.
Unnötig zu sagen, das Unerwartete HttpExceptionbietet eine WTF?! Moment, wenn Sie es nicht erwarten.
Die SessionEigenschaft der HttpApplicationKlasse wird folgendermaßen implementiert (von Reflector):
[Browsable(false), DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
public HttpSessionState Session
{
get
{
HttpSessionState session = null;
if (this._session != null)
{
session = this._session;
}
elseif (this._context != null)
{
session = this._context.Session;
}
if (session == null)
{
throw new HttpException(SR.GetString("Session_not_available"));
}
return session;
}
}
Vielen Dank, dass Sie sich die Mühe gemacht haben, eine bessere Antwort auszufüllen.
nicodemus13
12
Kein Problem. Ich hatte gerade eine ziemlich nervige WTF gehabt? Moment, der einige Zeit in Anspruch nahm, um zu klären. Ich dachte, ich würde es dokumentieren, damit nicht jemand anderes die Zeit damit verbringen müsste, herauszufinden, was los ist.
Nicholas Carey
8
Es gibt keinen Unterschied.
Der Getter für Page.Session gibt die Kontextsitzung zurück.
Intern verweist Page.Session nur auf It's HttpContext.Current.Session, es gibt jedoch immer noch zwei Unterschiede, je nachdem, wo es aufgerufen wird.
Auf Page.Session kann nur von Klassen zugegriffen werden, die von System.Web.UI.Page geerbt wurden. Beim Zugriff über WebMethod wird eine HttpException ausgelöst. Wobei als HttpContext.Current.Session von überall aus zugegriffen werden kann, solange Sie im Kontext einer Webanwendung ausgeführt werden.
Ein weiterer wichtiger Unterschied, bei dem Sie auf Page.Session zugreifen können, jedoch nicht auf HttpContext.Current.Session:
Wenn Ihre Seite eine Methode namens GetData enthält (von System.Web.UI.Page geerbt), die gleichzeitig in verschiedenen Threads von anderen ausgeführt wird Seitenmethode, GetData-Methode kann auf die Page.Seession zugreifen, Sie können jedoch nicht auf HttpContext.Current.Session zugreifen.
GetData wurde von einem anderen Thread aufgerufen, sodass HttpContext.Current null ist und HttpContext.Current.Session eine Nullreferenzausnahme auslöst, Page.Session jedoch wird weiterhin mit dem Seitenobjekt angehängt, damit die Seitenmethode GetData auf die Page.Session zugreifen kann.
Antworten:
Ein bisschen spät hier, aber hier ist etwas, das ich gerade entdeckt habe.
@Phillipe Leybaert und @CSharpAtl sind beide falsch.
HttpApplication
DieSession
Immobilie zeigt ein anderes Verhalten als die ImmobilieHttpContext.Current.Session
. Beide geben einen Verweis auf dieselbeHttpSessionState
Instanz zurück falls einer verfügbar ist. Sie unterscheiden sich darin, was sie tun, wennHttpSessionState
für die aktuelle Anforderung keine Instanz verfügbar ist.Nicht alle
HttpHandler
s bieten den Sitzungsstatus. DazuHttpHandler
muss der [eine oder beide?] Die Marker-Schnittstellen implementierenIRequiresSessionState
oderIReadOnlySessionState
.HttpContext.Current.Session
kehrt einfach zurücknull
wenn keine Sitzung verfügbar ist.Die
HttpApplication
Implementierung derSession
Eigenschaft durch wirft eineHttpException
Nachricht mitSession state is not available in this context.
anstatt einenull
Referenz zurückzugeben.Einige Beispiele dafür,
HttpHandler
dass keine Sitzung implementiert wird, sind die Standardhandler für normalerweise statische Ressourcen wie Bild- und CSS-Dateien. Jeder Verweis auf die Eigenschaft desHttpApplication
'sSession
in solchen Fällen (wie inglobal.asax
Ereignishandlern) führt dazu, dass einHttpException
Wurf ausgelöst wird.Unnötig zu sagen, das Unerwartete
HttpException
bietet eine WTF?! Moment, wenn Sie es nicht erwarten.Die
Session
Eigenschaft derHttpApplication
Klasse wird folgendermaßen implementiert (von Reflector):[Browsable(false), DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] public HttpSessionState Session { get { HttpSessionState session = null; if (this._session != null) { session = this._session; } else if (this._context != null) { session = this._context.Session; } if (session == null) { throw new HttpException(SR.GetString("Session_not_available")); } return session; } }
quelle
Es gibt keinen Unterschied.
Der Getter für Page.Session gibt die Kontextsitzung zurück.
quelle
Nichts.
Session
zeigt nur auf dieHttpContext.Current.Session
.quelle
Intern verweist Page.Session nur auf It's HttpContext.Current.Session, es gibt jedoch immer noch zwei Unterschiede, je nachdem, wo es aufgerufen wird.
Auf Page.Session kann nur von Klassen zugegriffen werden, die von System.Web.UI.Page geerbt wurden. Beim Zugriff über WebMethod wird eine HttpException ausgelöst.
Wobei als HttpContext.Current.Session von überall aus zugegriffen werden kann, solange Sie im Kontext einer Webanwendung ausgeführt werden.
Ein weiterer wichtiger Unterschied, bei dem Sie auf Page.Session zugreifen können, jedoch nicht auf HttpContext.Current.Session:
Wenn Ihre Seite eine Methode namens GetData enthält (von System.Web.UI.Page geerbt), die gleichzeitig in verschiedenen Threads von anderen ausgeführt wird Seitenmethode, GetData-Methode kann auf die Page.Seession zugreifen, Sie können jedoch nicht auf HttpContext.Current.Session zugreifen.
GetData wurde von einem anderen Thread aufgerufen, sodass HttpContext.Current null ist und HttpContext.Current.Session eine Nullreferenzausnahme auslöst, Page.Session jedoch wird weiterhin mit dem Seitenobjekt angehängt, damit die Seitenmethode GetData auf die Page.Session zugreifen kann.
quelle