我正在创建一个API,作为应用程序和其他两个API之间的桥梁。我想知道最好的方法是什么。我正在使用HttpClient。该应用程序有近千个用户,所以如果我使用同步调用,这意味着如果用户调用API,那么其他用户必须等到第一个用户获得响应才能继续执行其他API请求?有没有更好的方法来做这样的API?
以下是使用synchronous的代码示例:
[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);
}
}
如果我使用同步调用,那意味着如果用户调用API,那么其他用户必须等到第一个用户获得响应才能继续执行其他API请求
当请求进入管道时,框架会生成一个新线程。因此,如果1,000个请求同时进入,则第1,000个用户将不必等待其他999个请求完成。
无论如何,最好使用异步代码。对于任何类似网络请求的I / O,通常情况下你的性能通常会更好,让后台线程可以等待。旁注,您永远不想调用.Result
,因为这会强制异步代码变为阻塞并有效地变为同步。
将同步调用变成异步调用总是很容易,但另一种方法是充满危险。你应该让你的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
。
看来你错过了async
和await
的关键词。
public async String GetNumberofP([FromUri]GetNumberofPRequest getNPRequest){
(...)
var response = await httpClient.GetAsync();