代码之家  ›  专栏  ›  技术社区  ›  Dan McGrath

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

  •  1
  • Dan McGrath  · 技术社区  · 16 年前

    我们“做错事”了吗?

    我和一位同事正在处理一个ASP.NET页面,充当一个“门户”,查看unidata服务器上诊断程序的结果。尽管我们在工作中做着ASP/ASP.NET的零碎工作,但它不是我们的主要语言。

    要访问此服务器,我们必须使用uniobjects,它是用于身份验证和使用unidata服务器的API。

    我们需要访问网站的每个用户都必须通过unidata进行身份验证,并通过uniobjects库获得自己的会话,然后才能在不重新登录的情况下使用它(除非会话在“x”分钟内未使用)。

    我们提出的方法如下:

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

    如果用户转到我们的页面,而hashtable中不存在'username',则会重定向到一个登录页面,在该页面中创建会话对象,并在验证成功后将其添加到hashtable中。否则,它会从哈希表中获取用户现有的会话对象,并将其用于请求(除非它已过期,在这种情况下,我们会将其删除并重定向到登录页)。

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


    有人告诉我这个解决方案很难闻,但我没有足够的ASP.NET经验来计算我们应该做什么?有没有更好的方法来做这件事,或者说它真的可以吗?

    3 回复  |  直到 16 年前
        1
  •  2
  •   Rebecca    16 年前

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

    问题的一部分在于,如果用户只是关闭浏览器而不注销,或停止使用应用程序,则必须等到会话超时后才能将其关闭,并为许可问题释放UniObjects。

    我的建议如下:

    1. 将不可见的iframe添加到 母版页模板,或每个页面 如果您不使用 母版页。
    2. 母版页将 加载keepalive.aspx页, 包含元刷新,重新加载 每5分钟一页。
    3. 你可以 将会话超时减少到10 分钟(甚至6分钟)

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

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

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

        2
  •  2
  •   Kyle Rosendo    16 年前

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

    safe com wrapper-托管可释放的强类型安全包装到后期绑定的COM http://www.codeproject.com/KB/COM/safecomwrapper.aspx

    另一件值得注意的事情是,uniobjects com中的动态数组类存在线程问题,不能很好地处理.net。如果可以,可以在.NET中使用自己的动态数组类或数组拆分,而不是在UniObjects COM中使用动态数组类。

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

    如果需要与.NET一起使用的通用动态数组类,我可以提供一个。

    据我所知,uniobjects.net没有这些问题。

    内森校长

        3
  •  2
  •   Kyle Rosendo    16 年前

    当你说你在使用uniobjects时…您使用的是COM或.NET对象集吗?最简单的方法是使用单对象连接池。

    创建单例时,是将其存储在应用程序对象、会话对象还是缓存对象中?

    我建议使用应用程序对象,因为会话对象可以做一些奇怪的事情。处理和签出超时的一种方法是将缓存键与cacheremovecallback一起使用。通过这种方式,您可以使用文件/路径监视器依赖项来监视Windows文件的更改,从而导致手动删除或缓存依赖项超时。

    退一步讲,缓存依赖项的超时仅由页面活动驱动,如果ASP.NET会话循环,则可能/将破坏缓存依赖项。

    弥敦校长