C# 在创建调用2个其他API的API时,是否应该使用同步/异步API调用?
我正在创建一个API,作为应用程序和其他两个API之间的桥梁。我想知道做这件事的最好方法是什么。我正在使用HttpClient。这个应用程序有将近1000个用户,所以如果我使用同步调用,这是否意味着如果一个用户调用API,那么其他用户必须等到第一个用户得到响应后才能继续处理其他API请求?有没有更好的方法来实现这样的API 下面是我使用同步的代码示例:C# 在创建调用2个其他API的API时,是否应该使用同步/异步API调用?,c#,asp.net-web-api,httpclient,C#,Asp.net Web Api,Httpclient,我正在创建一个API,作为应用程序和其他两个API之间的桥梁。我想知道做这件事的最好方法是什么。我正在使用HttpClient。这个应用程序有将近1000个用户,所以如果我使用同步调用,这是否意味着如果一个用户调用API,那么其他用户必须等到第一个用户得到响应后才能继续处理其他API请求?有没有更好的方法来实现这样的API 下面是我使用同步的代码示例: [HttpGet] [Route("api/apiname")] public String GetNumberofP([FromUr
[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);
}
}
您似乎缺少
async
和wait
关键字
public async String GetNumberofP([FromUri]GetNumberofPRequest getNPRequest){
(...)
var response = await httpClient.GetAsync();
如果我使用同步调用,这是否意味着如果一个用户调用API,那么其他用户必须等到第一个用户得到响应后才能继续处理其他API请求
不会。当请求进入管道时,框架会产生一个新线程。因此,如果同时收到1000个请求,第1000个用户将不必等待其他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}");
}
[HttpGet]
[路线(“api/apiname”)]
公共任务GetNumberofP([FromUri]GetNumberofPRequest getNPRequest)
{
httpClient.DefaultRequestHeaders.Authorization=新的AuthenticationHeaderValue(“Bearer”,token.gettoken());
返回httpClient.GetAsync($“api/MobileApp/GetNumberP?strCardNumber={getNPRequest.strCardNumber}&strDateOfBirth={getNPRequest.strDateOfBirth}”);
}
您还应该考虑为每个调用创建一个新的<>代码HTTPclipse < /代码>。< /P>总是很容易将同步调用转换成异步调用,但反过来说则充满了危险。您应该使您的API异步。而且
catch(异常e)
是一种不好的反模式。您应该只捕获您可以有意义地处理的特定异常。这要视情况而定。虽然编写代码需要遵循一些规则,以便于维护代码。但是设计模式不是圣经。你的意思是在using语句中包装我的httpclient吗:using(var client=new httpclient()){//do thing with http client}@KateLastimosa-是的,正是这样。我应该使用using语句有什么具体的行为吗?我最初就是这样做的。但有些文章说不要这样做。这里是链接@KateLastimosa——我以前从未见过这一切。听起来太复杂了。或许可以试试WebClient
。