如何在WinUI 3应用中配置全局HttpClient,避免创建多个实例
WinUI 3 全局HttpClient配置方案
方案一:依赖注入实现(完全贴合.NET Core Startup配置风格)
该方案和ASP.NET Core的服务注册逻辑完全一致,支持配置多实例、请求管道、生命周期管理等高级特性。
- 先安装所需NuGet包:
Microsoft.Extensions.DependencyInjection、Microsoft.Extensions.Http - 修改
App.xaml.cs代码如下:
using Microsoft.Extensions.DependencyInjection; using System; using Microsoft.UI.Xaml; using System.Net.Http; namespace MyNameSpace { public partial class App : Application { // 全局服务容器 public IServiceProvider Services { get; } public App() { this.InitializeComponent(); // 注册服务,对应ASP.NET Core里的ConfigureServices方法 var serviceCollection = new ServiceCollection(); ConfigureServices(serviceCollection); Services = serviceCollection.BuildServiceProvider(); } private void ConfigureServices(ServiceCollection services) { // 注册全局HttpClient,可统一配置基础地址、超时、默认请求头 services.AddHttpClient<HttpClient>(client => { client.BaseAddress = new Uri("替换为你的API根地址"); client.Timeout = TimeSpan.FromSeconds(30); client.DefaultRequestHeaders.Add("Accept", "application/json"); }) // 可选:配置连接生命周期,避免DNS更新不生效问题 .ConfigurePrimaryHttpMessageHandler(() => new SocketsHttpHandler { PooledConnectionLifetime = TimeSpan.FromMinutes(2) }); // 注册应用窗口 services.AddTransient<MainWindow>(); } protected override void OnLaunched(Microsoft.UI.Xaml.LaunchActivatedEventArgs args) { // 从服务容器获取主窗口实例 m_window = Services.GetRequiredService<MainWindow>(); m_window.Activate(); } private Window m_window; } }
- 使用方式:在需要调用接口的类构造函数中直接注入HttpClient即可,示例:
public partial class MainWindow : Window { private readonly HttpClient _httpClient; // 构造函数注入,自动从全局服务容器获取实例 public MainWindow(HttpClient httpClient) { InitializeComponent(); _httpClient = httpClient; } // 后续所有接口请求直接使用该_httpClient实例即可 }
方案二:轻量单例实现(无需额外依赖)
如果不需要依赖注入的高级特性,可以直接在App类中定义静态单例HttpClient,实现全局复用。
修改后的App.xaml.cs代码如下:
using System; using System.Net.Http; using Microsoft.UI.Xaml; namespace MyNameSpace { public partial class App : Application { // 全局唯一HttpClient实例,应用启动时仅初始化一次 public static readonly HttpClient GlobalHttpClient = new HttpClient { BaseAddress = new Uri("替换为你的API根地址"), Timeout = TimeSpan.FromSeconds(30) }; public App() { this.InitializeComponent(); } protected override void OnLaunched(Microsoft.UI.Xaml.LaunchActivatedEventArgs args) { m_window = new MainWindow(); m_window.Activate(); } private Window m_window; } }
使用方式:直接在任意位置调用App.GlobalHttpClient发起请求即可。
注意事项
- 不要在每次发起请求时新建HttpClient实例,会导致端口资源耗尽
- 全局HttpClient无需手动释放,应用退出时会自动清理资源
- 如果需要实现请求重试、熔断、日志等特性,推荐使用方案一配合Polly包实现,用法和ASP.NET Core完全一致
内容的提问来源于stack exchange,提问作者A developer
相关产品推荐
相关产品推荐

