为HTTP瞬时异常实现Polly重试策略时遇到问题求助
Polly重试策略覆盖服务不可用/内部错误的解决方案
核心问题
你的getResponse有WCF和API两个实现,抛出的服务不可用、内部服务器错误对应的异常类型,不在当前策略的Handle范围内,因此无法触发重试。
分场景调整策略
1. 针对API实现的HTTP状态码异常
如果API实现通过HttpRequestException封装了HTTP状态码(500/503),需要在策略中增加状态码判断:
Policy.Handle<HttpRequestException>(ex => ex.StatusCode == HttpStatusCode.ServiceUnavailable || ex.StatusCode == HttpStatusCode.InternalServerError) .Or<TimeoutException>() .Or<BadRequestException>() .Retry(3); // 可按需修改重试次数
2. 针对WCF实现的自定义异常
如果WCF实现抛出的是自定义异常(比如ServiceNotAvailableException、InternalServerErrorException),直接将这些异常类型加入策略:
Policy.Handle<HttpRequestException>(ex => ex.StatusCode == HttpStatusCode.ServiceUnavailable || ex.StatusCode == HttpStatusCode.InternalServerError) .Or<TimeoutException>() .Or<BadRequestException>() .Or<ServiceNotAvailableException>() // WCF服务不可用异常 .Or<InternalServerErrorException>() // WCF内部错误异常 .Retry(3);
3. 兼容两种实现的通用写法
如果两个实现的异常没有统一类型,可通过异常消息关键词或通用筛选逻辑覆盖:
Policy.Handle<Exception>(ex => // 匹配异常消息中的关键词 ex.Message.Contains("serviceNotAvailable") || ex.Message.Contains("Internal server error") || // 保留原有需要重试的异常类型 ex is TimeoutException || ex is BadRequestException || // 处理API的HTTP状态码异常 (ex is HttpRequestException httpEx && (httpEx.StatusCode == HttpStatusCode.ServiceUnavailable || httpEx.StatusCode == HttpStatusCode.InternalServerError))) .Retry(3);
验证建议
分别触发WCF和API的服务不可用、内部错误场景,确认Polly能正常触发重试逻辑。
内容的提问来源于stack exchange,提问作者User123
相关产品推荐
相关产品推荐

