C# 我需要一本字典吗?普通字典行吗?

C# 我需要一本字典吗?普通字典行吗?,c#,asp.net-web-api,concurrentdictionary,C#,Asp.net Web Api,Concurrentdictionary,我目前正在使用ConcurrentDictionary保存一组已通过API验证的登录名。我这样做是为了防止来自其他web客户端的重复登录(这是系统架构的要求)。如果用户使用已“登录”的登录进行身份验证,则会给他们一个选择 继续,上一次登录将过期 取消,当前会话将注销 我使用的是ConcurrentDictionary,因为它应该是线程安全的,这在多个客户端访问API的环境中非常重要 我要问的是,是否需要ConcurrentDictionary,因为我在删除集合中与给定键匹配的所有项时遇到问题。在

我目前正在使用
ConcurrentDictionary
保存一组已通过API验证的登录名。我这样做是为了防止来自其他web客户端的重复登录(这是系统架构的要求)。如果用户使用已“登录”的登录进行身份验证,则会给他们一个选择

  • 继续,上一次登录将过期
  • 取消,当前会话将注销
  • 我使用的是
    ConcurrentDictionary
    ,因为它应该是线程安全的,这在多个客户端访问API的环境中非常重要


    我要问的是,是否需要
    ConcurrentDictionary
    ,因为我在删除集合中与给定键匹配的所有项时遇到问题。在这种情况下是否需要
    ConcurrentDictionary
    ?如果不是,一本普通的
    字典就足够了吗?如果没有,并且需要一个
    ConcurrentDictionary
    ,是否有一种方法可以删除与给定键匹配的所有条目?我所能看到的是
    TryRemove()
    ,它似乎只删除了一个条目。

    您问题的直接答案:

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

    记住,字典中每个键有一个条目。这就是字典的定义,而ConcurrentDictionary不会改变这一点

    下面是对您的要求的更全面、更完整的回答


    整个解决方案都是短视的,因为您与会话基础结构没有连接,无法知道用户的会话何时超时并有效地导致他们注销。此外,如果您曾经考虑部署到一个能够产生新实例的云平台,那么您的应用程序就不会与其他实例进行协调

    换言之,你将自己置于这样一种境地:在不破坏此功能的情况下,很难扩展你的应用程序

    处理单会话需求最可靠的方法之一可能是使用数据库:

    • 有一个字段,用于跟踪用户登录时的上一个会话ID
    • 添加以在会话超时时清除该字段
    • 如果会话ID与字段中的ID不同,则表明您有新的登录尝试
    • 如果需要对会话ID进行完全控制,则提供自己的(可能需要在其中包含编码的服务器ID)

    你会发现这个需求比表面上看起来要复杂得多。你不能像web空间中的桌面应用程序那样思考——这正是这个需求的来源。

    ConcurrentDictionary
    中,只有一个条目与密钥匹配。我的意思不是不尊重,但你的身份验证方法让我担心。像WebAPI这样的Web技术是无状态的。您不应该跟踪谁登录了内存。我将彻底重新考虑身份验证/授权过程。也许可以查阅一些现有的框架和示例,有很多。@Lee-我甚至没有意识到这一点。也许这就是为什么没有办法去除所有的。@Igor-我不同意你的看法。API可以是您需要的任何东西。它似乎对我们很有用。@webworm,不。标准字典不是threadsafe,这甚至不是我要问的问题。问题是关于ConcurrentDictionary的,而ConcurrentDictionary是错误的答案。然而,如果它持有共享状态,那么它比标准字典要好。我同意@BerinLoritsch。如果服务器重置,用户的登录凭据可能仍然有效,但现在您将不知道,因为您的字典是空的。如果计划通过跨多台主机提供负载平衡来扩展应用程序,则一台主机上的字典(并发或非并发)在另一台主机上看不到字典。尽管您可以强制用户返回同一台服务器,但从架构上讲,字典和ConcurrentDictionary是错误的方法。