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

如何向Polly的Fallback策略传入Request参数以解决编译报错

问题根源
  • 你当前使用的是非泛型Policy类,其Fallback方法的默认入参是CancellationToken类型,无法直接接收你自定义的Request参数
  • 你现有代码中_policy.Execute( GetResponse(request))的写法存在逻辑错误:该写法会先直接执行GetResponse(request)拿到返回值再传入策略,策略完全没有包裹执行逻辑,自然也不会触发降级
修复方案

推荐两种可行的写法,你可以根据场景选择:

写法1:简化逻辑直接包裹执行(适合简单降级场景)

不需要在策略定义阶段处理参数,直接在执行方法内把主执行逻辑和降级逻辑都用lambda包裹,写法最直观:

private IExecuter primary;
private IExecuter secondary;
private readonly Policy _policy;
public Client()
{
    primary = new Executer("primary");
    secondary = new Executer("secondary");
    // 策略仅定义触发降级的异常条件
    _policy = Policy
        .Handle<Exception>();
}

public Response Process(Request request)
{
    // 把执行逻辑全部包裹在Execute的lambda内
    return _policy.Execute(() => 
    {
        return primary.Execute(request);
    }, () => GetResponseFallback(request));
}

private Response GetResponseFallback(Request request)
{
    return secondary.Execute(request);
}

写法2:使用Polly Context传递参数(符合Polly原生规范)

如果需要严格遵循Polly的设计规范,用Context容器传递自定义参数:

private IExecuter primary;
private IExecuter secondary;
private readonly Policy _policy;
public Client()
{
    primary = new Executer("primary");
    secondary = new Executer("secondary");

    _policy = Policy
        .Handle<Exception>()
        // 从Fallback的Context参数中取出预先存入的Request
        .Fallback((context) => GetResponseFallback((Request)context["request"]));
}

public Response Process(Request request)
{
    // 构造Context存储当前请求参数
    var context = new Context();
    context["request"] = request;
    // 传入Context执行主逻辑
    return _policy.Execute(ctx => primary.Execute((Request)ctx["request"]), context);
}

private Response GetResponseFallback(Request request)
{
    return secondary.Execute(request);
}

两种写法都可以解决编译报错,正常触发主执行器失败后调用备用执行器的降级逻辑。

内容的提问来源于stack exchange,提问作者Buda Gavril

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 17:48:04