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是错误的方法。