受信リクエストごとに2つの別々のWebサービスを呼び出し、後処理を実行して結果を返すWebApiがあります。
最初の Web サービス呼び出しはローカルに 1 時間キャッシュされ、この中のデータによって 2 番目の Web サービスへのクエリが決定されます。2 番目の Web サービスは、着信要求ごとに呼び出されます。2 番目の要求が行われた後、各結果はビジネス ロジックで処理され、クライアントの応答に返されます。
2 番目の Web サービスへの呼び出しは、await キーワードを許可しないサード パーティの DLL を使用しているため、非同期にすることはできません。私が行ったことは、2 番目の Web サービス呼び出しと後処理を、コントローラーから呼び出される 1 つの非同期関数にラップすることです。
// /api/controller/news?key=a&state=b
public async Task<HttpResponseMessage> GetNews(string key, string state)
{
// call to first webservice if not in cache
if (JsonConfig != null && JsonConfig.Configuration.NewsQuery.ContainsKey(key))
{
var results = await SearchProxyProvider.Search(filters.All, filters.Any, filters.None, filters.Sort, 100, 0, true, state, true);
int totalCount = results.TotalCount;
return Request.CreateResponse(HttpStatusCode.OK, results);
}
}
// Helper class method
public async Task<ItemCollection<Item>> Search(List<FieldValuePair> allFilters, List<FieldValuePair> anyFilters, List<FieldValuePair> noneFilters, SortedFieldDictionary sortBy, int pageSize = 100, int pageNumber = 0, bool exact = true, string stateFilter = null, bool getAllResults = true)
{
// call to 2nd api
search = SomeApi.Search(allFilters, anyFilters, noneFilters, pageSize, pageNumber, exact,
sortBy, null, WebApiConstant.Settings.CustomFields, true);
// post processing on search results
return search;
}
最初の Web サービスの呼び出しはローカルにキャッシュされるため、これを非同期にするメリットはあまりありません。
このアプローチが完全に間違っているか正しいかを確認したいだけです。