创建调用其他2个API的API时,应该使用同步/异步API调用吗?

时间:2019-03-25 02:55:33

标签: c# asp.net-web-api httpclient

我正在创建一个API,用作应用程序和其他2个API之间的桥梁。我想知道最好的方法是什么。我正在使用HttpClient。该应用程序有近一千个用户,所以如果我使用同步调用,是否意味着如果一个用户调用API,那么其他用户必须等到第一个用户获得响应后才能继续处理其他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 个答案:

答案 0 :(得分:3)

  

如果我使用同步调用,则意味着如果一个用户调用了API,则其他用户必须等到第一个用户获得响应后,才能继续处理其他API请求

不。当请求进入管道时,框架会产生一个新线程。因此,如果同时发送1,000个请求,则第1,000个用户将不必等待其他999个请求完成。

无论如何,最好还是使用异步代码。对于任何类似网络请求的I / O,通常让性能更好的是让后台线程等待。旁注,您永远不要调用.Result,因为这会迫使异步代码变为阻塞状态并有效地变为同步状态。

答案 1 :(得分:1)

将同步调用转换为异步调用总是很容易,但是相反的方法充满了危险。您应该使您的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

答案 2 :(得分:-2)

似乎您缺少asyncawait关键字。

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

         var response = await httpClient.GetAsync();