Refit结合Polly访问ASP.NET Core Web API

2023-11-05 21:38

本文主要是介绍Refit结合Polly访问ASP.NET Core Web API,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

前言

在.NET Core应用中访问ASP.NET Core Web API接口,常用的方式是使用IHttpClientFactory生成HttpClient实例,并通过结合Polly策略,以实现重试,熔断等机制。

在本文中,我们将介绍如何使用Refit,结合Polly访问ASP.NET Core Web API。

Refit介绍

Refit是一个类型安全的REST开源库,可通过Refit更加简单安全地访问Web API接口。

首先,需要将Web API接口转换成interface:

public interface IWeatherAPI
{[Get("/WeatherForecast")]Task<WeatherForecast[]> Get();
}

然后,通过RestService类生成IWeatherAPI的代理实现,通过代理直接调用Web API接口:

var weatherAPI = RestService.For<IWeatherAPI>("http://localhost:5000");var weatherForeCasts = await weatherAPI.Get();

结合Polly

1.手工执行

可以通过Policy.ExecuteAsync方法执行Web API调用代码。下列代码实现了重试机制:

var weatherAPI = RestService.For<IWeatherAPI>("http://localhost:5000");var weatherForeCasts = await Policy.Handle<HttpRequestException>(ex => ex.InnerException.Message.Any()).RetryAsync(10, async (exception, retryCount) =>{await Console.Out.WriteLineAsync(exception.Message);}).ExecuteAsync(async () => await weatherAPI.Get());

8627361b2a0952eb4a6aa699ea29bdf0.png

2.依赖注入

更加方便的方式是使用依赖注入的方式,自动将Refit和Polly结合起来。

首先,引用Nuget包:

Refit.HttpClientFactory
Microsoft.Extensions.Http.Polly

然后,修改Startup.cs,注册RefitClient,并增加了超时和重试策略:

AsyncRetryPolicy<HttpResponseMessage> retryPolicy = HttpPolicyExtensions.HandleTransientHttpError().Or<TimeoutRejectedException>() .WaitAndRetryAsync(10, _ => TimeSpan.FromMilliseconds(5000));AsyncTimeoutPolicy<HttpResponseMessage> timeoutPolicy = Policy.TimeoutAsync<HttpResponseMessage>(TimeSpan.FromMilliseconds(30000));services.AddRefitClient<IWeatherAPI>().ConfigureHttpClient(c => c.BaseAddress = new Uri("http://localhost:5000")).AddPolicyHandler(retryPolicy).AddPolicyHandler(timeoutPolicy);

最后,直接使用IWeatherAPI:

private readonly IWeatherAPI _weatherAPI;public WeatherForecastController(IWeatherAPI weatherAPI)
{_weatherAPI = weatherAPI;
}[HttpGet]
public async Task<IEnumerable<WeatherForecast>> Get()
{var weatherForeCasts = await _weatherAPI.Get();return weatherForeCasts;
}

结论

今天,我们介绍了2种Refit结合Polly访问ASP.NET Core Web API的方法。推荐使用依赖注入方式,简化Refit集成Polly的操作。

如果你觉得这篇文章对你有所启发,请关注我的个人公众号”My IO“

这篇关于Refit结合Polly访问ASP.NET Core Web API的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/352666

相关文章

Java对接Dify API接口的完整流程

《Java对接DifyAPI接口的完整流程》Dify是一款AI应用开发平台,提供多种自然语言处理能力,通过调用Dify开放API,开发者可以快速集成智能对话、文本生成等功能到自己的Java应用中,本... 目录Java对接Dify API接口完整指南一、Dify API简介二、准备工作三、基础对接实现1.

一文详解如何在Vue3中封装API请求

《一文详解如何在Vue3中封装API请求》在现代前端开发中,API请求是不可避免的一部分,尤其是与后端交互时,下面我们来看看如何在Vue3项目中封装API请求,让你在实现功能时更加高效吧... 目录为什么要封装API请求1. vue 3项目结构2. 安装axIOS3. 创建API封装模块4. 封装API请求

使用easy connect之后,maven无法使用,原来需要配置-Djava.net.preferIPv4Stack=true问题

《使用easyconnect之后,maven无法使用,原来需要配置-Djava.net.preferIPv4Stack=true问题》:本文主要介绍使用easyconnect之后,maven无法... 目录使用easGWowCy connect之后,maven无法使用,原来需要配置-DJava.net.pr

在.NET平台使用C#为PDF添加各种类型的表单域的方法

《在.NET平台使用C#为PDF添加各种类型的表单域的方法》在日常办公系统开发中,涉及PDF处理相关的开发时,生成可填写的PDF表单是一种常见需求,与静态PDF不同,带有**表单域的文档支持用户直接在... 目录引言使用 PdfTextBoxField 添加文本输入域使用 PdfComboBoxField

Python结合PyWebView库打造跨平台桌面应用

《Python结合PyWebView库打造跨平台桌面应用》随着Web技术的发展,将HTML/CSS/JavaScript与Python结合构建桌面应用成为可能,本文将系统讲解如何使用PyWebView... 目录一、技术原理与优势分析1.1 架构原理1.2 核心优势二、开发环境搭建2.1 安装依赖2.2 验

springboot项目中常用的工具类和api详解

《springboot项目中常用的工具类和api详解》在SpringBoot项目中,开发者通常会依赖一些工具类和API来简化开发、提高效率,以下是一些常用的工具类及其典型应用场景,涵盖Spring原生... 目录1. Spring Framework 自带工具类(1) StringUtils(2) Coll

Spring Boot项目中结合MyBatis实现MySQL的自动主从切换功能

《SpringBoot项目中结合MyBatis实现MySQL的自动主从切换功能》:本文主要介绍SpringBoot项目中结合MyBatis实现MySQL的自动主从切换功能,本文分步骤给大家介绍的... 目录原理解析1. mysql主从复制(Master-Slave Replication)2. 读写分离3.

JSON Web Token在登陆中的使用过程

《JSONWebToken在登陆中的使用过程》:本文主要介绍JSONWebToken在登陆中的使用过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录JWT 介绍微服务架构中的 JWT 使用结合微服务网关的 JWT 验证1. 用户登录,生成 JWT2. 自定义过滤

一文教你如何将maven项目转成web项目

《一文教你如何将maven项目转成web项目》在软件开发过程中,有时我们需要将一个普通的Maven项目转换为Web项目,以便能够部署到Web容器中运行,本文将详细介绍如何通过简单的步骤完成这一转换过程... 目录准备工作步骤一:修改​​pom.XML​​1.1 添加​​packaging​​标签1.2 添加

基于Flask框架添加多个AI模型的API并进行交互

《基于Flask框架添加多个AI模型的API并进行交互》:本文主要介绍如何基于Flask框架开发AI模型API管理系统,允许用户添加、删除不同AI模型的API密钥,感兴趣的可以了解下... 目录1. 概述2. 后端代码说明2.1 依赖库导入2.2 应用初始化2.3 API 存储字典2.4 路由函数2.5 应