我需要ConcurrentDictionary吗?常规词典会吗?

时间:2016-06-15 19:33:11

标签: c# asp.net-web-api concurrentdictionary

我目前正在使用ConcurrentDictionary来保存已使用我的API进行身份验证的登录名集合。我这样做是为了防止来自其他Web客户端的重复登录(系统架构的要求)。如果用户使用已经登录的登录进行身份验证"他们有选择......

  1. 继续,之前的登录将过期
  2. 取消,当前会话将被注销
  3. 我正在使用ConcurrentDictionary因为它应该是线程安全的,这在多个客户端访问API的环境中很重要。

    我要问的是,是否需要ConcurrentDictionary,因为我在删除集合中与给定密钥匹配的所有项目时遇到了麻烦。在这种情况下是否需要ConcurrentDictionary?如果没有,那么Dictionary是否足够?如果没有,并且需要ConcurrentDictionary,是否有一种方法可以删除与给定密钥匹配的所有条目?我只能看到TryRemove(),它似乎只删除了一个条目。

1 个答案:

答案 0 :(得分:1)

直接回答你的问题:

  

是的,您需要ConcurrentDictionary。您正在跨多个线程共享状态。

请记住,字典每个键有一个条目。这是对词典的定义,而ConcurrentDictionary并没有改变它。

以下是对您的要求的更全面和更完整的答案。

整个解决方案是短视的,因为您与会话基础架构没有任何关联,无法知道用户的会话何时超时并​​有效地导致它们被注销。此外,如果您考虑部署到可以旋转新实例的云平台,则无法与您的应用的其他实例进行协调。

换句话说,如果不破坏此功能,您就会陷入难以扩展应用的境地。

处理单个会话要求的最有效方法之一可能是使用您的数据库:

  • 有一个字段可以跟踪用户登录时的最后一个会话ID。
  • 在会话超时时添加session listener以清除字段
  • 如果会话ID与字段中的内容不同,则表示您有新的登录尝试。
  • 如果您需要完全控制会话ID,请提供您自己的session id manager(可能需要在其中包含已编码的服务器ID)。

您会发现需求比表面上的声音要多得多。你不能像网络空间中的桌面应用程序一样思考 - 这正是这个要求的来源。