You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何正确创建带配置选项的Refit HttpClient中间件扩展?

如何正确创建带配置选项的Refit HttpClient中间件扩展?

嘿,这个需求其实很好实现,只需要在你的扩展方法里先把配置选项解析出来,再把它用到HttpClient的BaseAddress配置里就行。我给你调整一下代码,你看看:

首先是你的ServerOptions类不用改,然后修改AddServers扩展方法:

public class ServerOptions {
    public string MyServerUrl { get; set; }
}

public static IServiceCollection AddServers(this IServiceCollection services, Action<ServerOptions> configureOptions = null) {
    // 如果没有传入配置委托,直接返回原服务集合
    if (configureOptions is null) 
        return services;

    // 实例化配置选项对象,并用用户传入的委托填充属性
    var serverOptions = new ServerOptions();
    configureOptions(serverOptions);

    // 可选:把配置选项注册到DI容器里,方便其他服务后续注入使用
    services.AddSingleton(serverOptions);

    // 做个简单的校验,避免空地址导致Uri创建失败
    if (string.IsNullOrWhiteSpace(serverOptions.MyServerUrl)) {
        throw new ArgumentException("请在配置选项中设置有效的MyServerUrl地址,不能为空或空白");
    }

    // 注册HttpClient和Refit客户端,这里直接用配置好的MyServerUrl设置BaseAddress
    services.AddHttpClient();
    services.AddRefitClient<IMyServerService>(new RefitSettings(new NewtonsoftJsonContentSerializer()))
        .AddHttpMessageHandler<MyServerHandler>()
        .ConfigureHttpClient(client => client.BaseAddress = new Uri(serverOptions.MyServerUrl));

    return services;
}

关键步骤说明:

  • 我们先手动实例化了ServerOptions,然后调用用户传入的configureOptions委托,这样就能拿到用户设置的MyServerUrl了
  • 加了一个空值校验,防止用户漏填地址导致后续创建Uri时抛出莫名其妙的异常,调试起来更省心
  • 可选的把配置选项注册到DI容器,要是其他服务需要用到这些服务器配置,直接注入ServerOptions就能用,不用再重复读取配置
  • 最后在ConfigureHttpClient里直接用serverOptions.MyServerUrl给BaseAddress赋值就搞定了

调用方式和你预想的完全一样:

services.AddServers(options => {
    options.MyServerUrl = configuration["App:MyServerUrl"];
});

另外提个小建议:最好确保MyServerUrl是标准的Uri格式(比如带http://或https://),不然创建Uri对象时还是会报错哦。

内容来源于stack exchange

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.07 12:59:32