2

我正在编写一个托管在 IIS 上的 ASP.NET ApiController。在一个动作中,我需要调用一个名为 A 的 Web 服务,该服务由一家名为腾讯的公司提供。该服务要求我使用密钥进行身份验证。密钥是通过调用另一个Web界面生成的,来自腾讯的B,密钥有效期为3小时。服务 B 每天的通话次数有限制。因此,当我想使用 A 时,我无法调用 B。我只能调用 B 一次并将密钥存储在数据库中以备将来使用。

这意味着每次我想使用服务 A 时,我都需要检查数据库中密钥的验证,如果它已过期,则调用 B 并获取一个新的。

现在,当我需要通过调用 B 来更新我的密钥时,如果在返回新密钥之前,再次调用 ApiController 操作怎么办?新的请求也会发现数据库中的key已经失效,然后继续调用B,使得A新获取的key失效,导致A再次获取key,死循环。

我的问题是,你如何摆脱这种担忧?我该如何开始?来自 SQL、IIS 或 ASP.NET?

我正在使用 EF6 读取/写入数据库并使用 ASP.NET MVC 5。

谢谢你的帮助!

-- 补充 -- 我被建议使用 lock 关键字。但是,我想放心,知道锁将保护所有 IIS 请求中的数据库读/写部分。那么是否有任何关于 IIS 如何处理对同一个 ASP.NET 模块的多个请求并对其进行并发控制的文章?

4

1 回答 1

1

在有问题的代码周围使用锁。lock 关键字确保一个线程不进入代码的临界区,而另一个线程在临界区。如果另一个线程试图输入一个锁定的代码,它将等待、阻塞,直到对象被释放。

请参阅https://msdn.microsoft.com/en-us/library/c5kehkcz.aspx

如果它在集群环境中,您还需要在数据库级别创建一个事务,该事务将在执行更新之前检查上次更新/到期。

于 2015-09-15T11:54:27.790 回答