在不阻塞的情况下限制异步请求

本文关键字:异步 请求 情况下 | 更新日期: 2023-09-27 18:34:47

我在使用多个 Web 服务时寻求一些关于限制 HTTP 请求的建议/策略。我觉得如果请求是同步发生的,我可以这样做,但它们是异步的,并且认为我应该尝试以我不会阻止的方式执行限制逻辑。

由于 Web 应用使用多个 Web 服务,因此不同的请求将有不同的限制。我在想这样的事情,但不确定如何以无阻塞的方式进行:

请求方法:

public static Task<string> AsyncRequest(string url, enum webService)
{
    using(LimitingClass limiter = new LimitingClass(webService))
    {
       //Perform async request
    }
}        

在 LimitingClass 中,它将具有诸如检查给定 Web 服务的最后一个请求之类的逻辑,如果它违反了限制,那么它将等待一定的时间。但与此同时,如果另一个请求进入不同的 Web 服务,那么我不希望在 LimitingClass 等待时阻止该请求。上述方法有什么根本性的问题吗?我应该为每个 LimitingClass 实例打开一个新线程吗?

如果可能的话,一些伪代码会很棒。

非常感谢

更新:

这是我当前请求方法的简化版本:

public static Task<string> MakeAsyncRequest(string url, string contentType)
{
    HttpWebRequest request = //set up my request
    Task<WebResponse> task = Task.Factory.FromAsync(
        request.BeginGetResponse,
        asyncResult => request.EndGetResponse(asyncResult),
        (object)null);
    return task.ContinueWith(t => ReadCallback(t.Result));
}

我只想将其包装在一个用于检查限制并且不会阻止其他请求的用途中。

在不阻塞的情况下限制异步请求

那么,如何在不阻塞的情况下限制对资源的访问呢?

我认为您需要查看信号量 - 它们允许限制可以同时访问资源或资源池的线程数量。