并发HttpClient调用抛出500内部服务器错误

时间:2016-05-25 21:04:31

标签: c# concurrency asp.net-web-api2 dotnet-httpclient refit

我正在使用带有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实例。

任何想法都非常感激。

0 个答案:

没有答案