我正在开发一个允许其用户管理其帐户的网页。 做某事的请求可能如下所示:
Browser -> Web Server -> API
,其中每个箭头都是HTTP请求。
访问API时,我需要一个访问令牌。此令牌不是特定于用户的,但属于整个站点。当用户想要做某事时,该令牌可能不存在。如果是这样,我需要获取它。在获取它时,其他用户可能想要做某事,并且还发现该令牌不存在。由于获取访问令牌的请求正在进行中,我想让用户等待获取访问令牌的请求返回,然后在请求完成时使用访问令牌。
麻烦的是我需要一些方法让每个用户的进程等待第一个用户发起的调用返回。可能会这样做(访问令牌将存储在应用程序状态中):
lock (lockObj) {
if (hasAccessToken)
return GetResponseFromApplicationState().accessToken;
var response = FetchAccessToken();
SaveResponseInApplicationState(response);
return response.accessToken;
}
据我所知, lock
会将线程排队。但是,我不喜欢在锁定块中包含HTTP请求的想法,因为如果请求永远不会返回,它可能会死锁,或类似的东西。也许我可以在lock
设置超时,但我对此不确定。
我该如何解决这个问题?我可以以某种方式为每个用户排队进程吗?