我在我的 ASP.Net 网站上使用 Yahoo Uploader(Yahoo UI 库的一部分)来允许用户上传文件。对于那些不熟悉的人,上传器通过使用 Flash 小程序让我更好地控制 FileOpen 对话框。我可以为文件类型指定过滤器,允许选择多个文件等。这很好,但它有以下记录的限制:
由于已知的 Flash 错误,在 Windows 的 Firefox 中运行的 Uploader 不会随上传发送正确的 cookie;它不发送 Firefox cookie,而是发送相应域的 Internet Explorer cookie。作为一种解决方法,我们建议使用无 cookie 上传方法或将 document.cookie 附加到上传请求。
因此,如果用户使用 Firefox,我不能依靠 cookie 在他们上传文件时保持会话。我需要他们的会议,因为我需要知道他们是谁!作为一种解决方法,我正在使用 Application 对象:
Guid UploadID = Guid.NewGuid();
Application.Add(Guid.ToString(), User);
因此,我正在创建一个唯一 ID 并将其用作将Page.User
对象存储在 Application 范围内的键。上传文件时,我将该 ID 作为变量包含在 POST 中。然后,在接受文件上传的处理程序中,我因此抓住了 User 对象:
IPrincipal User = (IPrincipal)Application[Request.Form["uploadid"]];
这确实有效,但它有两个明显的缺点:
如果 IIS、应用程序池,甚至只是应用程序在用户访问上传页面和实际上传文件之间重新启动,则它们的“uploadid”将从应用程序范围中删除,并且上传失败,因为我无法对其进行身份验证.
如果我曾经扩展到网络农场(甚至可能是网络花园)场景,这将完全崩溃。我可能并不担心,但我确实计划在未来扩展这个应用程序。
有没有人有更好的方法?有没有办法让我在 POST 变量中传递实际的 ASP.Net 会话 ID,然后在另一端使用该 ID 来检索会话?
我知道我可以通过 获取会话 ID Session.SessionID
,并且我知道如何使用 YUI 将其发布到下一页。我不知道如何使用它SessionID
从状态服务器中获取会话。
是的,我正在使用状态服务器来存储会话,因此它们会保持应用程序/IIS 重新启动,并且可以在 Web 场场景中工作。