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

问题描述 投票:1回答:3

我正在创建一个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);           
    }      
}
c# asp.net-web-api httpclient
3个回答
3
投票

如果我使用同步调用,那意味着如果用户调用API,那么其他用户必须等到第一个用户获得响应才能继续执行其他API请求

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

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


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
投票

看来你错过了asyncawait的关键词。

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

         var response = await httpClient.GetAsync();
© www.soinside.com 2019 - 2024. All rights reserved.