ASP.NET处理外部服务器会话 - 清理

时间:2010-02-05 06:27:08

标签: c# asp.net unidata uniobjects

我们“做错了吗”?

一位同事和我正在乱搞一个ASP.NET页面,充当“门户”,以查看UniData服务器上诊断程序的结果。虽然我们在工作中做了ASP / ASP.NET的奇怪工作,但它不是我们的主要语言。

要访问此服务器,我们必须使用UniObjects,这是一个用于验证和使用UniData服务器的API。

我们需要访问该网站的每个用户必须通过UniData进行身份验证并通过UniObjects库获取自己的会话,然后无需再次登录即可使用它(除非会话未在'x'分钟内使用)。

我们提出的方法如下:

我们有一个带有Hashtable的单例。它将Windows用户名映射为会话对象。

如果用户访问我们的页面并且Hashtable中不存在“用户名”,则会重定向到创建会话对象的登录页面,如果身份验证成功,则会将其添加到Hashtable。否则,它从Hashtable中获取用户现有的会话对象,并将其用于请求(除非它已过期,在这种情况下我们将其删除并重定向到登录页面)。

每个会话对象(来自UniObjects的东西的包装器对象)都有一个“lastUsed”方法。我们需要清理用户的会话,因为我们对登录到UniData服务器的用户有许可限制,因此每次用户被重定向到登录页面时,它都会检查是否在'x'分钟中没有使用任何会话,在这种情况下,它关闭该会话并将其从Hashtable中删除。这是在这里完成的,因此用户不会遇到任何与每次请求检查所有会话相关的延迟,只能在登录时进行。


有些东西告诉我这个解决方案有气味,但我没有足够的ASP.NET经验来解决我们应该做的事情?有没有更好的方法来实现这一目标还是实际上没问题?

3 个答案:

答案 0 :(得分:2)

由于您的所有用户似乎都经过身份验证,我建议您考虑使用不同的方式来管理会话状态和超时。

您遇到的部分问题是,如果用户只是在没有注销的情况下关闭浏览器,或者停止使用该应用程序,则必须等到会话超时以将其终止并释放UniObjects以解决您的许可问题。

我的建议如下:

  1. 为您的免费添加一个不可见的IFRAME MasterPage模板,或每个页面 如果你不使用,在网站上 MasterPages。
  2. MasterPage会 加载一个KeepAlive.aspx页面 包含META刷新,重新加载 页面每5分钟一次。
  3. 你可以 将会话超时减少到10 分钟(甚至可能是6分钟)
  4. 现在,如果用户关闭了他们的浏览器窗口,他们的会话比平常快得多,但如果他们的浏览器窗口保持打开状态,他们的会话就会持久。

    可以看到代码示例和演练here

    您现在需要解决方案以防止用户整夜打开浏览器窗口并占用您的UniData许可证。在这种情况下,我将实现一个类似的方法,其中一个停滞的页面(即用户20分钟没有做任何事情)刷新到注销ASPX页面,清除会话。

答案 1 :(得分:2)

当您说您正在使用UniObjects时......您使用的是COM还是.NET对象集?最简单的方法是使用UniObject Conneciton池。

创建单例时,是将它存储在Application对象,Session对象还是Cache对象中?

我会建议Application对象,因为Session对象可以做奇怪的事情。处理和检查超时的一种方法是将Cache Key与CacheRemoveCallback一起使用。这样,您可以使用文件/路径监视器依赖关系来监视Windows文件更改以手动删除,或者从缓存依赖项中超时。

回到这一点,缓存依赖关系的超时仅由页面活动驱动,如果asp.net会话循环使用,它可能/将会破坏缓存依赖关系。

纳丹校长

答案 2 :(得分:2)

如果您使用的是UniObjects COM,请确保您的COM编组工作正常。看看:

SafeCOMWrapper - 托管一次性强类型安全包装到后期绑定的COM http://www.codeproject.com/KB/COM/safecomwrapper.aspx

需要注意的另一件事是,UniObjects COM中的动态数组类有一个线程问题,它不能与.NET一起使用。如果可以,请在.NET中使用您自己的动态数组类或数组拆分,而不是UniObjects COM中的Dynamic数组类。

有时当您尝试从类中访问数据时,它会显示一个空字符串,但是当您调试它时,数据就在那里。不知道这个的根本原因。

如果你需要一个适用于.NET的通用动态数组类,我可以为你提供一个。

据我所知,UniObjects.NET没有这些问题。

纳丹校长