【问题标题】:best way to share "session state" type data between two .net applications在两个 .net 应用程序之间共享“会话状态”类型数据的最佳方式
【发布时间】:2010-10-11 15:53:33
【问题描述】:

我们有一个 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”)。 - 不知道该怎么做...

【问题讨论】:

    标签: .net .net-2.0 session-state state-server


    【解决方案1】:

    我会在我的建议前面说,最好 将复杂性降至最低的方法是使用状态服务器。这是他们旨在解决的问题。

    说了这么多……

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

    一种选择是使用 Web 服务或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 服务共享对象时,您可能需要考虑到这一点。

    【讨论】:

      【解决方案2】:

      我知道你说过你想远离 Session State Server....

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

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

      【讨论】:

        【解决方案3】:

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

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

        【讨论】:

          【解决方案4】:

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

          【讨论】:

            【解决方案5】:

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

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

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

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

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

            【讨论】:

              【解决方案6】:

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

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2013-08-24
                • 2016-10-11
                • 2011-11-06
                • 2018-11-18
                • 1970-01-01
                相关资源
                最近更新 更多