我正在创建一个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);
}
}
答案 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)
似乎您缺少async
和await
关键字。
public async String GetNumberofP([FromUri]GetNumberofPRequest getNPRequest){
(...)
var response = await httpClient.GetAsync();