1

我们“做错了”吗?

我和一位同事正在使用 ASP.NET 页面来充当“门户”来查看 UniData 服务器上诊断程序的结果。尽管我们在工作中做了 ASP/ASP.NET 的零星工作,但它并不是我们的主要语言。

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

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

我们想出的方法如下:

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

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

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


有些东西告诉我这个解决方案有异味,但我没有足够的 ASP.NET 经验来确定我们应该做什么?有没有更好的方法可以做到这一点,或者实际上可以吗?

4

3 回答 3

2

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

当你创建你的 Singleton 时,你是把它存储在 Application 对象、Session 对象还是 Cache 对象中?

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

回想一下,缓存依赖项的超时仅由页面活动驱动,如果 asp.net 会话回收,它可能/将破坏缓存依赖项。

内森校长

于 2010-02-05T18:20:02.183 回答
2

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

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

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

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

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

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

内森校长

于 2010-02-10T17:45:31.837 回答
2

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

您遇到的部分问题是,如果用户只是关闭浏览器而不注销,或者停止使用应用程序,您必须等到会话超时才能将其关闭并释放 UniObjects 以解决您的许可问题。

我的建议如下:

  1. 将不可见的 IFRAME 添加到您的 MasterPage 模板或站点中的每个页面(如果您不使用 MasterPages)。
  2. 该 MasterPage 将加载一个包含 META 刷新的 KeepAlive.aspx 页面,每 5 分钟重新加载一次页面。
  3. 您可以将会话超时减少到 10 分钟(甚至可能 6 分钟)

现在,如果用户关闭他们的浏览器窗口,他们的会话超时比平时快得多,但如果他们的浏览器窗口保持打开状态,他们的会话是持久的。

可以在此处查看代码示例和演练。

您现在需要解决方案来防止用户让他们的浏览器窗口整夜打开并占用您的 UniData 许可证。在这种情况下,我将实施类似的方法,将停滞页面(即用户在 20 分钟内什么都没做)刷新为注销 ASPX 页面,从而清除会话。

于 2010-02-05T06:59:51.467 回答