我正在使用带有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的客户端问题或者我的服务器需要特殊的配置来处理请求,这些请求一次下降就可以处理。
我正在使用Web API 2服务器。
我也在考虑是否可以在我的设置中重复使用不同端点配置的相同HttpClient实例。
任何想法都非常感激。