我正在开发一个使用.NET的StaticFileHandler来提供动态生成内容的应用程序...... 我们的应用程序的另一部分使用当前的HttpSession来存储用户特定的数据。
由于StaticFileHandler旨在处理静态文件,因此它不实现IRequiresSessionState,因此通过应用程序部分的任何内容都无法访问应用程序其余部分的特定于会话的数据。
StaticFileHandler是System.Web的内部函数,因此我不能将它扩展到我自己的类中,该类也实现了IRequiresSessionState。当我检测到它是空的时,还有其他方法可以强制创建会话吗?
答案 0 :(得分:1)
我们还有一个自定义会话提供程序正在使用一些更有效的缓存,所以我能够捎带它自己创建会话。如果其他人有兴趣,这是我的代码,但请注意,如果你想借用,你必须自己调整它:
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);
}
这个难题的大部分是关于获取SessionStateStoreData对象的部分。如果您正在使用默认实现,请通过.NET反射器来了解如何访问它!
此外,一个缺点是SessionStateModule仅在会话实际更改后才创建cookie。但是,通过这段代码,我不得不一直创建cookie,即使我实际上只是在非常罕见的情况下使用会话。