Je travaille sur une application qui utilise StaticFileHandler de .NET pour servir du contenu généré dynamiquement ... Il y a aussi une autre partie de notre application qui utilise l'actuelle HttpSession pour stocker des données spécifiques à l'utilisateur. Comme StaticFileHandler est conçu pour gérer les fichiers statiques, il n'implémente pas IRequiresSessionState, donc tout ce qui passe par cette partie de l'application n'a pas accès aux données spécifiques à la session du reste de l'application. StaticFileHandler est interne à System.Web. Je ne peux donc pas simplement l'étendre dans ma propre classe qui implémente également IRequiresSessionState. Existe-t-il un autre moyen de forcer la création de la session lorsque je détecte qu'elle est nulle?Forcer la création de HttpContext.Current.Session dans .NET
Répondre
Nous avions également un fournisseur de sessions personnalisées qui utilisait une mise en cache plus efficace, ce qui m'a permis de créer moi-même la session. Voici mon code si quelqu'un d'autre est intéressé, mais notez que vous devrez modifier vous-même si vous voulez emprunter:
public void EnsureSessionExists(HttpContext context) {
if (context.Session != null) {
// Hey, we've already got a session. That was easy...
return;
}
bool isNew = false;
string sesId = _sessionIdManager.GetSessionID(context);
if (String.IsNullOrEmpty(sesId)) {
// if ID is null or empty, it means we're creating a new session?
sesId = _sessionIdManager.CreateSessionID(context);
}
SessionStateStoreData data = GetSessionDataStore(context, sesId);
if (data == null) {
isNew = true;
data = CreateNewStoreData(context, _sessionTimeout);
// Create doesn't put it in the cache. This does.
SetSessionDataStore(context, sesId, data);
}
HttpSessionStateContainer container = new HttpSessionStateContainer(sesId, data.Items, data.StaticObjects, data.Timeout, isNew, HttpCookieMode.UseCookies, SessionStateMode.Custom, false);
SessionStateUtility.AddHttpSessionStateToContext(context, container);
// Force the cookie to get set here. SessionStateModule only sets it if the Handler has IRequiresSessionState
HttpCookie cookie = new HttpCookie("ASP.NET_SessionId", _sessionIdManager.Encode(sesId));
cookie.Expires = DateTime.MinValue; // DateTime.MinValue makes it a session cookie.
context.Response.Cookies.Add(cookie);
}
Le gros morceau du casse-tête est la partie à obtenir l'objet SessionStateStoreData. Si vous utilisez l'implémentation par défaut, amusez-vous à regarder à travers le réflecteur .NET pour savoir comment y accéder! En outre, un inconvénient est que SessionStateModule crée un cookie seulement une fois que la session est réellement changée. En passant par ce code, cependant, je suis obligé de créer le cookie tout le temps, même si je n'utilise réellement la session que dans un cas très rare.
+1: Je cherchais quelque chose comme ça depuis longtemps, merci – kenchilada