1

我正在使用ASP.Net 无 cookie 会话,以便通过 302 重定向将其放置在 URL 中来跟踪应用程序的会话 ID,例如,如果用户要访问以下 URL

http://yourserver/folder/default.aspx

然后,它们将被重定向到类似于以下内容的 URL,然后继续提供实际页面内容

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(带有显式处理程序映射)和 IIS 8 上工作。

4

1 回答 1

0

我从实验和反编译 ASP.Net 源代码中发现,SessionStateModule根据请求是否IHttpHandler实现IRequiresSessionStateIReadOnlySessionState. 如果这些都不是真的,那么一切都取决于是否有人曾经SetSessionStateBehavior将会话状态行为设置为Requiredor 或ReadOnly

默认情况下,静态文件处理程序不执行任何这些操作,因此不会为静态文件创建会话 - 为了确保为需要会话状态的静态文件设置会话状态行为,我只需在BeginRequest事件期间设置会话状态行为对于应用程序

// In Global.asax.cs
void Application_BeginRequest(object sender, EventArgs e)
{
    HttpContext.Current.SetSessionStateBehavior(SessionStateBehavior.Default);
}

我敢肯定有更好的方法,但这对我有用。

于 2012-10-29T16:39:05.473 回答