3

我们有一个 Web 应用程序,开始时很小,添加的任何新功能都只是作为同一个项目的一部分,但是现在我们想为这些插件创建新项目......

我们创建了一个新项目,它继承了主项目的 global.asax,并且还可以访问主项目的 web.config,但是,在全局 asax 代码中有会话检查数据完整性,以查看用户是否已登录..这是我们遇到问题的地方..用户已登录,但站点错误指出他们未登录,因为插件项目无法访问由主项目设置的会话用户 ID。

目前我们没有使用会话状态服务器或 sql 状态服务器,我们希望避免使用它以避免对一些旧代码造成任何麻烦。

我们也不想走互斥锁的路线..如果可以的话,我们也想远离 Windows 编码......

会话发生的情况的站点概述:用户使用 asp 代码(.net 1.1 代码)登录 用户经过身份验证并成功登录,将该用户的 guid 发送到数据库,主项目(.net 2.0 代码)抓住它guid,获取用户数据并将用户 ID 存储在会话中。任何需要知道用户是谁的页面,都从 session("userid")

所以:我们创建另一个继承 global.asax 的项目,可以访问 web.config - 完成!

我们想要在此之上做的:让这个新项目包含一个页面(来自主项目的插件功能)让这个页面访问从主项目设置的会话(“userid”)。- 不知道该怎么做...

4

6 回答 6

3

我会在我的建议之前说,将复杂性保持在最低限度的最佳方法是使用状态服务器。这是他们旨在解决的问题。

说了这么多...

由于这两个应用程序必须在不同的进程中运行(因为它们在不同的运行时版本中),它们不能直接共享数据。

一种选择是使用 Web Services 或Remoting您可以拥有一个存储所有会话数据的 CustomSession 对象,并通过Guid识别每个数据。您可以跟踪 Guid-CustomSession 在应用程序 A 中创建的所有现有会话,并通过查询字符串将 Guid 传递给应用程序 B。应用程序 B 可以通过 Web 服务或远程处理使用 Guid 查询应用程序 A,并获取相应的 CustomSession 对象. 你也可以反过来做同样的事情。

这里唯一的问题是,当从 App A 中的页面移动到 App B 中的页面时,您必须确保在 URL 中始终提供 Guid,反之亦然。应用程序总是可以检查会话是否不存在,以回退到使用 Guid 来查看其他应用程序是否有会话。

请注意,某些 .NET 数据结构(不多)在 .NET 1.1 和 2.0 之间的序列化方式不同,因此在通过远程处理或 Web 服务共享对象时,您可能需要考虑这一点。

于 2009-03-06T00:42:27.780 回答
2

我知道你说过你想远离会话状态服务器......

但我仍然认为这是最好的选择。特别是如果您计划共享更多数据而不仅仅是登录 ID,以实现未来的可扩展性和可维护性。通过会话状态服务器共享登录数据也比通过查询字符串等将其保存在客户端更安全。

但是同样,无论您最终共享会话数据是什么,就像另一位海报“Rex M”指出的那样,您需要小心您共享的会话数据类型以及它需要可序列化。

于 2009-03-06T01:02:42.990 回答
2

使用 Web 服务或远程处理类似于会话状态服务器,不同之处在于您必须自己实现它——可能不值得付出努力。

如果您要自己执行此操作,还有一个之前未提及的问题:会话超时。您需要确保两个进程对上次使用会话的时间有相同的想法。如果你做的不对(我也遇到过这种情况),你可能会进入一种看起来像是登录到应用程序的一部分而不是另一部分的状态。

于 2009-03-06T05:17:23.360 回答
0

Rex M:我们正在尝试在相同版本的 .net 之间共享会话数据。两者都在运行 .net 3.5,(在 .net 2.0 框架上运行)我们已经有了将登录数据转移到 2.0 框架的代码。

我们有主项目工作,但是我们想用模块添加到它上面,我们想简单地说,如果你添加另一个 .net Web 应用程序,不要使用命名空间,并设置会话状态服务器,设置你的引用,然后编译,一切都将是肉汁..

两个应用程序(试图与之共享会话数据的应用程序)都运行 2.0 框架,都在同一个应用程序池中,都具有相同的机器密钥和状态服务器信息,都运行在同一台机器上,只是在不同的文件夹中, (但是共享相同的父文件夹)

我们能做些什么来让它发挥作用吗?

(不使用 sql 状态服务器)。

于 2009-03-09T13:32:21.740 回答
0

您可以使用 cookie 来存储您的用户 ID。您的 1.1 和 2.0 应用程序都可以毫无问题地访问它。

于 2009-03-06T01:12:00.923 回答
0

在两个 Web 应用程序之间导航时,您可以使用一个或多个加密的查询字符串变量来传递,以便您可以在两个 Web 应用程序中查询并重新建立重要的会话变​​量。这是最简单的方法。

于 2009-06-15T15:29:43.680 回答