在两个.net应用程序之间共享“会话状态”类型数据的最佳方法

时间:2009-03-06 00:10:45

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

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

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

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

我们也不想去互斥体的路线..如果我们可以,也希望远离Windows编码......

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

所以: 我们创建了另一个项目,它可以访问web.config - DONE!

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

6 个答案:

答案 0 :(得分:3)

我会在我的建议前加上说,将复杂性降至最低的最佳方法是使用状态服务器。这是他们设计要解决的问题。

有人说过......

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

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

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

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

答案 1 :(得分:2)

我知道你说你想要离开Session State Server ....

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

但是,无论你最终做什么来分享会话数据,就像其他海报“Rex M”所指出的那样,你需要注意你分享的会话数据类型以及它需要序列化-able。

答案 2 :(得分:2)

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

如果您打算自己这样做,还有一个前面未提到的问题:会话超时。您需要确保两个进程对上次使用会话的时间有相同的想法。如果你做得不对(而且我遇到过这种情况),你将面临进入一种状态的风险,即你已经登录到应用程序的一部分而不是另一部分。

答案 3 :(得分:0)

您可以使用Cookie来存储您的UserID。你的1.1& 2.0应用程序可以毫无问题地访问它。

答案 4 :(得分:0)

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

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

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

我们可以做些什么才能让它发挥作用?

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

答案 5 :(得分:0)

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