Должен ли я использовать синхронные / асинхронные вызовы API при создании API, который вызывает 2 других API? - PullRequest
1 голос
/ 25 марта 2019

Я создаю API, который служит мостом между приложением и 2 другими API. Я хочу знать, если это лучший способ сделать это. Я использую HttpClient. Приложение имеет почти тысячу пользователей, поэтому если я использую синхронные вызовы, значит ли это, что если пользователь вызывает API, то другие пользователи должны ждать, пока 1-й пользователь получит ответ, прежде чем он перейдет к другим запросам API? Есть ли лучший способ сделать такой API?

Вот пример моего кода с использованием синхронного:

[HttpGet]
[Route("api/apiname")]     
public String GetNumberofP([FromUri]GetNumberofPRequest getNPRequest){          

    var request = JsonConvert.SerializeObject(getNPRequest);
    string errorMessage = "";           

    try{              
         httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token.gettoken());

         var response = httpClient.GetAsync("api/MobileApp/GetNumberP?"
                          + "strCardNumber=" + getNPRequest.strCardNumber
                         + "&strDateOfBirth=" + getNPRequest.strDateOfBirth).Result;
         return response;
    }            
    catch (Exception e){                
        throw utils.ReturnException("GetNumberofP", e, errorMessage);           
    }      
}

Ответы [ 3 ]

3 голосов
/ 25 марта 2019

если я использую синхронные вызовы, означает ли это, что если пользователь вызывает API, то другие пользователи должны ждать, пока 1-й пользователь получит ответ, прежде чем он перейдет к другим запросам API

Нет.Когда запрос поступает в конвейер, фреймворк создает новый поток.Таким образом, если одновременно поступит 1000 запросов, 1000-му пользователю не придется ждать завершения остальных 999 запросов.

В любом случае, для этого лучше использовать асинхронный код.Для любых сетевых запросов ввода-вывода, таких как производительность, обычно лучше работать, если фоновый поток выполняет ожидание.Примечание: вы никогда не захотите вызывать .Result, потому что это заставляет асинхронный код блокироваться и фактически становится синхронным.

1 голос
/ 28 марта 2019

t всегда легко превратить синхронный вызов в асинхронный, но наоборот это чревато опасностью. Вы должны сделать свой API асинхронным.

[HttpGet]
[Route("api/apiname")]
public Task<string> GetNumberofP([FromUri]GetNumberofPRequest getNPRequest)
{
    httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token.gettoken());
    return httpClient.GetAsync($"api/MobileApp/GetNumberP?strCardNumber={getNPRequest.strCardNumber}&strDateOfBirth={getNPRequest.strDateOfBirth}");
}

Вам также следует рассмотреть возможность создания нового httpClient для каждого вызова.

0 голосов
/ 25 марта 2019

Кажется, вам не хватает ключевых слов async и await.

public async String GetNumberofP([FromUri]GetNumberofPRequest getNPRequest){
            
(...)

         var response = await httpClient.GetAsync();
...