【发布时间】:2017-05-17 13:02:51
【问题描述】:
我目前对带有 dotnet 核心的 REST api 中的 async/await 有疑问。我正在开发一个需要使用 HttpClient 的 GetAsync 方法进行一些 http 调用的 api。这是它的工作原理:
这是我的控制器中的 get 方法:
[HttpGet]
public async Task<IActionResult> Get(string url, string aid)
{
try
{
//...
var cancellationTokenSource = new CancellationTokenSource();
var task = Task.Factory.StartNew(async () => await _htmlService.HtmlLinkCheck(aid, cancellationTokenSource.Token, correctUrl), cancellationTokenSource.Token);
ConnectionsHelper.RegisterTask(aid, task, cancellationTokenSource);
ConnectionsHelper.UpRequest(aid);
return Ok("Ok");
}
catch (Exception exception)
{
return this.InternalServerError(exception);
}
}
这个方法正在调用一个在启动文件中注入和配置的服务,如下所示:
services.AddScoped<IRequestService, RequestService>();
services.AddScoped<IHtmlCheckService, HtmlCheckService>();
进入 HtmlCheckService 进入 HtmlLinkCheck 我正在调用 requestService 进行调用:
private async Task CheckHtmlLink(CancellationToken token)
{
//...
var result = await _requestService.GetRequest(handledUrl.url);
和 GetRequest 方法一样:
public async Task<string> GetRequest(Uri url)
{
// ...
var response = await _httpClient.GetAsync(url);
_httpClient 是一个静态变量(由 RequestService 的所有不同实例使用):
private static HttpClient _httpClient;
public RequestService()
{
var handler = new HttpClientHandler();
if (handler.SupportsAutomaticDecompression)
{
handler.AutomaticDecompression = DecompressionMethods.GZip |
DecompressionMethods.Deflate;
}
_httpClient = new HttpClient(handler);
_httpClient.DefaultRequestHeaders.Add("User-Agent", "Mozilla/5.0 (Windows NT 10.0; WOW64; rv:51.0) Gecko/20100101 Firefox/51.0");
}
如果我向我的 REST API 发出 100 个请求,那么对于每个请求,对 GetAsync 的调用在每个请求(实例RequestService 因为 AddScope 方法创建注入)?看起来它是否可以并行工作,但我怎么能确定呢?
为每个 RequestService 实例创建一个新的 httpClient 实例会更有效吗?
提前感谢您的回答
【问题讨论】:
标签: .net rest asynchronous asp.net-core async-await