我正在使用ASP.Net cookieless sessions,以便通过302重定向将其放入网址来跟踪应用程序的会话ID,例如,如果用户要访问以下网址
http://yourserver/folder/default.aspx
然后,他们将重定向到类似于以下内容的网址,然后该网址将继续提供实际的网页内容
http://yourserver/folder/(S(849799d1-7ec0-41dc-962d-a77e1b958b99))/default.aspx
我遇到的问题是应用程序的入口点实际上是一个静态页面(例如扩展名为.html的页面),和ASP.Net没有发出会话ID &安培;将用户重定向到此页面。因此,这意味着指向ASP.Net托管内容(例如链接,iframe等等)的链接每个都会导致为这些链接中的每一个创建新的会话ID。出于兼容性原因,我无法轻易更改页面扩展名(虽然这确实解决了问题)。
如何提示ASP.Net为我的页面创建会话?我已经尝试添加一个显式的处理程序映射,以确保页面由ASP.Net模块处理,但这没有影响 - 调试时我可以看到正在为此页面创建一个SessionIDManager
实例(意味着ASP.Net已经通过集成管道处理此页面,无论我的处理程序映射如何),但是ASP.Net仍然没有为此页面创建会话。
我正在使用IIS 7,但是这也需要在IIS 6(带有expicit处理程序映射)和IIS 8上工作。
答案 0 :(得分:0)
我从实验中发现并反编译ASP.Net源,SessionStateModule
根据请求的IHttpHandler
是否实现IRequiresSessionState
来决定是否为请求创建会话。 1}}或IReadOnlySessionState
。如果这些都不是真的那么全部归结为某人是否使用SetSessionStateBehavior
将会话状态行为设置为Required
或ReadOnly
。
默认情况下,静态文件处理程序不会执行任何这些操作,因此不会为静态文件创建会话 - 以确保为需要会话状态的静态文件设置会话状态行为我只需设置会话状态行为在应用程序的BeginRequest
事件期间
// In Global.asax.cs
void Application_BeginRequest(object sender, EventArgs e)
{
HttpContext.Current.SetSessionStateBehavior(SessionStateBehavior.Default);
}
我确信有更好的方法,但这对我有用。