我正在使用带有 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 实例。
任何想法都非常感谢。