Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/279.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在创建调用2个其他API的API时,是否应该使用同步/异步API调用?_C#_Asp.net Web Api_Httpclient - Fatal编程技术网

C# 在创建调用2个其他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

我正在创建一个API,作为应用程序和其他两个API之间的桥梁。我想知道做这件事的最好方法是什么。我正在使用HttpClient。这个应用程序有将近1000个用户,所以如果我使用同步调用,这是否意味着如果一个用户调用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);           
    }      
}

您似乎缺少
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