Singleton HttpClient 在多个异步请求上抛出 OperationCanceledException

问题描述 投票:0回答:0

我有一个 MAUI 应用程序与远程 ASP.NET Core 6 Web API 交互。当我实现请求基础设施时,我遵循了各种关于在整个应用程序中重用

HttpClient
对象的重要性的指示,而不是处理它(以免遇到套接字耗尽)。

所以我实现了以下类来管理我的

HttpClient
并通过它执行对 API 的任何应用程序请求:

public class HttpClientManager
{
    // Singleton class
    const string SERVER_URL = "https://myapiaddress/";

    public const string MEDIATYPE = "application/json";

    private static HttpClientManager clientManager;
    private static readonly object objSync = new();    // thread-safe guaranteed
    public HttpClient Client;

    private HttpClientManager()   
    {
        Client = new HttpClient
        { 
            Timeout = TimeSpan.FromMinutes(10),
            BaseAddress = new Uri(SERVER_URL)
        };

        Client.DefaultRequestHeaders.Accept.Clear();
        Client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue(MEDIATYPE));
    }

    public static HttpClientManager GetHttpClient()
    {
        lock (objSync)
        {
            if (clientManager == null)
            {
                // lazy initialization: gets back the same instance for the object
                clientManager = new();
            }

            return clientManager;
        }
    }

    public void SetAuthentication(string token)
    {
        Client.DefaultRequestHeaders.Authorization =
            new AuthenticationHeaderValue("Bearer", token);
    }
}

我通过

HttpClient
方法得到我的
GetHttpClient
,然后执行任何请求。但不幸的是,使用这种方法并执行多个异步请求时,我总是在第二个同时请求时得到一个
OperationCanceledException
,所以我被迫序列化操作并避免多次调用(这正是异步编程想要解决的问题)。

我研究了几种方法,但找不到任何解决方案。此外,我尝试为每个请求创建(并处理)一个

HttpClient
,这似乎可以解决问题。尽管如此,根据 Microsoft 文档,它仍然是一种错误的方法。

如何使用单例

HttpClient
实例并同时处理多个请求?

c# singleton asp.net-core-webapi httprequest dotnet-httpclient
© www.soinside.com 2019 - 2024. All rights reserved.