【问题标题】:Does it going to be asynchronous它会是异步的吗
【发布时间】: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


    【解决方案1】:

    HttpClient 旨在允许多个同时请求。

    一旦使用,它就不允许你像BaseAddressDefaultRequestHeaders 那样更改属性;如果您需要为不同的请求设置不同的属性,那么您应该为这些请求使用不同的 HttpClient 实例。

    但在一般情况下,是的,您应该为每个共享其属性值的请求使用一个 HttpClient 实例。

    【讨论】:

    • 感谢您的回复。不,我不需要更改每个请求的属性。所以如果我理解正确,我的实现是正确的?
    • @FlawinneJulien:是的。
    • 或者您可以使用SendAsync() 并在HttpRequestMessage 上指定标题等,对吗?
    • 是的,我还想知道是否可以在每次实例化 requestService 时重新实例化我的静态变量(因为我在构造函数中做了一个新的 HttpClient ...)。
    • a if(_httpClient == null { var handler ... 应该做的事情。但显然你说我的代码在请求之间运行异步:) 这是我最初的问题
    猜你喜欢
    • 2011-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-27
    • 2017-02-19
    • 2015-08-03
    • 2019-01-05
    相关资源
    最近更新 更多