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 内部サーバーを理解することはちょっと不可能です。私のサーバーは呼び出しを 1 つずつ処理しているため、これが私が使用している API のクライアント側の問題なのか、それともサーバーが必要としているのかを理解しようとしています。リクエストを処理するための特別な構成。一度に 5 つずつ処理する必要があります。

Web API 2 サーバーを使用しています。

また、同じ HttpClient インスタンスをセットアップで異なるエンドポイント構成で再利用できるかどうかも考えています。

どんな考えでも大歓迎です。

4

0 に答える 0