3

我正在使用带有 1-2 个接口的Refit并为 Web API 请求生成我的客户端 RESTful 类。

public interface IApiClient<T> where T : new()
    {
        [Get("")]
        Task<IEnumerable<T>> GetInitialOrUpdatedData(string clientId);
    }

在一个类中,我有 60 个属性,如下所示。

public IApiClient<Order> Orders { get; private set; }
public IApiClient<OrderDetail> OrderDetails { get; private set; }
public IApiClient<Company> Companies { get; private set; }
public IApiClient<User> Users { get; private set; }
public IApiClient<Address> Addresses { get; private set; }
public IApiClient<Product> Products { get; private set; }
// ...

并初始化如下。

Orders  = RestService.For<IApiClient<Order>>(GetHttpClient("/Order"));
OrderDetails = RestService.For<IApiClient<OrderDetail>>(GetHttpClient("/OrderDetail"));
Companies = RestService.For<IApiClient<Company>>(GetHttpClient("/Company"));
Users = RestService.For<IApiClient<User>>(GetHttpClient("/User"));
// ...

GetHttpClient(string) 为每个资源端点返回一个新的 HttpClient 实例。

private const string BaseUrlAddress = @"http://yourURL/api";

private HttpClient GetHttpClient(string address)
{
    HttpClient httpClient = new HttpClient(new NativeMessageHandler())
    {
        BaseAddress = new Uri(BaseUrlAddress + address),
        Timeout = TimeSpan.FromMinutes(3)
    };
    httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
    return httpClient;
}

在遥远的银河系的某个地方,我有一些存储库,它们将以下列方式对所有这些 API 进行并发调用,请注意,我使用Punchclock将调用限制为一次 5 个。

private OperationQueue _queue = new OperationQueue(5 /* at a time */);
private const int LowPriority = 1;
private const int NormalPriority = 5;
private const int HighPriority = 10;

方法调用中的任务列表。

IEnumerable<Task> tasks = new List<Task>
            {
                _queue.Enqueue(NormalPriority, () => Orders .GetAllAsync(clientId)),
                _queue.Enqueue(NormalPriority, () => OrderDetails .GetAllAsync(clientId)),
                _queue.Enqueue(NormalPriority, () => Companies .GetAllAsync(clientId)),
                _queue.Enqueue(NormalPriority, () => Users .GetAllAsync(clientId)),
                _queue.Enqueue(NormalPriority, () => Addresses .GetAllAsync(clientId))
        };

        await Task.WhenAll(tasks).ConfigureAwait(false);

正如我所注意到的,上面将向随机表抛出 500 个内部服务器错误。将调用更改为串行异步效果很好!

await Orders.GetAllAsync(workerId).ConfigureAwait(false);
await OrderDetails .GetAllAsync(workerId).ConfigureAwait(false);
await Companies .GetAllAsync(workerId).ConfigureAwait(false);
await Users .GetAllAsync(workerId).ConfigureAwait(false);
await Addresses .GetAllAsync(workerId).ConfigureAwait(false);

当 500 内部服务器不一致时,有点不可能理解它,并且由于我的服务器可以一个一个地处理调用,我试图了解这是我正在使用的 API 的客户端问题还是我的服务器需要处理请求的特殊配置,一次 5 个是下降处理。

我正在使用 Web API 2 服务器。

我也在考虑是否可以通过我的设置重用具有不同端点配置的相同 HttpClient 实例。

任何想法都非常感谢。

4

0 回答 0