我有一个 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
实例并同时处理多个请求?