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“

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/296325.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

10个经典的爆炸化学反应,个个都是你惹不起的“暴脾气”

全世界只有3.14 % 的人关注了爆炸吧知识没有放过火&#xff0c;没有爆炸过&#xff0c;就不算真正学化学的。还有谁能比化学狗们的胆子更大、回忆更深刻吗&#xff1f;化学狗们能活到现在简直是个奇迹&#xff5e;&#xff5e;&#xff5e;懂的就默默转了吧&#xff01;小编整理…

根目录下各文件夹的作用

"/"目录下有好多文件&#xff0c;究竟有什么作用&#xff1f;整理综合了网上的一些资料&#xff0c;以RHEL6为标准。 一、管理类文件夹&#xff1a; /boot&#xff1a;包括内核和其它系统启动时使用的文件。 /initrd&#xff08;RHEL6中没有&#xff09;&#xff1a;…

java result元素_Java JDBC 中获取 ResultSet 的大小

当我们执行完一条Sql语句&#xff0c;获取到一个 ResultSet 对象后&#xff0c;有时我们需要立即知道到底返回了多少个元素&#xff0c;但是 ResultSet 并没有提供一个 size() 方法 or length 的属性&#xff0c;我们可以一个一个调用 next() 去累加计算&#xff0c;但是我们还…

wpf中的datagrid中如何显示图片

2012-09-11 10:55 在datagrid中添加一个模板列&#xff0c;xaml内容如下&#xff1a; <DataGridTemplateColumn Header"头像" Width"SizeToCells" IsReadOnly"True"> <DataGridTemplateColumn.CellTemplate> <DataTemplate> &…

狗为什么吃屎?真相男默女泪,但看完后你也会流口水......

全世界只有3.14 % 的人关注了爆炸吧知识别人笑狗太疯癫狗笑他人看不穿据说&#xff0c;200%的网友在学习一门新语言时&#xff0c;都会从最基本的日常问候语开始学起&#xff0c;例如——骂人。危险动作&#xff0c;请勿模仿。那但凡是学过汉语的人应该都知道&#xff0c;咱们中…

linux limit

linux ulimit调优 2010-05-21 23:54:39| 分类&#xff1a; linux | 标签&#xff1a; |字号大中小 订阅 1,说明:ulimit用于shell启动进程所占用的资源.2,类别:shell内建命令3,语法格式:ulimit [-acdfHlmnpsStvw] [size]4,参数介绍:-H 设置硬件资源限制.-S 设置软件资源限制.-a …

java跨平台的特性_【简答题】什么是跨平台特性?Java怎样实现跨平台特性?

编制检索工具体系的基本要求是()。A、按需编制B、种类适当C、结构合理D、分工清楚E、著录标引规范儿童逻辑思维处于萌芽阶段是在()。A.4岁左右B.6岁左右C.8岁左右D.10岁左右幼儿鉴赏幼儿文学的特殊性是由幼儿的()所决定的。A.生活环境B.时代特征C.年龄心理特征D.个体工作面瓦斯…

WPF开发登录窗口之——添加文本输入框用户控件

WPF开发者QQ群&#xff1a; 340500857 | 微信群 目前人数太多&#xff0c;暂不开放窗口开发完成后&#xff0c;接下来就是开发客户区中的输入框控件&#xff0c;但在开发之前&#xff0c;我们先开发一个输入框基类&#xff0c;然后通过继承的方式去实现文本输入框与密码输入框…

JSTL分割字符 fn:split()

2019独角兽企业重金招聘Python工程师标准>>> <% page language"java" contentType"text/html; charsetUTF-8"%> <% taglib uri"http://java.sun.com/jsp/jstl/core" prefix"c"%> <% taglib uri"http:/…

javascript 中的暗物质 - 闭包

1. 诡异的闭包 javascript 中有一个特殊的特性 - 闭包&#xff0c;对于 .NET 程序员来说&#xff0c;比较熟悉的是面向对象的程序设计 OOP, 而来自函数式语言的闭包则显得比较诡异&#xff0c;许多程序员对它敬而远之。 对于闭包我们还是要从函数式语言的特点说起。 不知道你有…

女友的前男友教我该怎么照顾她......

1 总觉得不太对劲&#xff1f;▼2 这回复真神&#xff01;&#xff08;via.机智得赵老师&#xff09;▼3 奇怪的知识又增加了......▼4 卖茶小妹真的与时俱进...&#xff08;via.外卖小哥金城武&#xff09;▼5 超大容量花露水没见过吧&#xff1f;&#xff01;▼6 别人在…

笔记本电脑优化指南

一、旧本本运行如飞的八大绝技 由于目前技术以及其他因素的限制&#xff0c;主流配置的笔记本电脑仍然与主流台式机的性能有相当的差距&#xff0c;这差距表现出来的就是流畅度&#xff0c;但是只要优化得当&#xff0c;二手本本也能运行如飞&#xff01;1.系统优化首先&#…

浅谈.Net异步编程的前世今生----EAP篇

前言在上一篇博文中&#xff0c;我们提到了APM模型实现异步编程的模式&#xff0c;通过使用APM模型&#xff0c;可以简化.Net中编写异步程序的方式&#xff0c;但APM模型本身依然存在一些缺点&#xff0c;如无法得知操作进度&#xff0c;不能取消异步操作等。针对这些缺点&…

java sql objects_Java SQL注入学习笔记

1 简介文章主要内容包括&#xff1a;Java 持久层技术/框架简单介绍不同场景/框架下易导致 SQL 注入的写法如何避免和修复 SQL 注入2 JDBC介绍JDBC&#xff1a;全称 Java Database Connectivity是 Java 访问数据库的 API&#xff0c;不依赖于特定数据库 ( database-independent …

CentOS 5 CentOS 6 启动流程及关键步骤

CentOS 5 CentOS 6 启动流程及关键步骤1、加电自检&#xff1a;当打开主机电源时&#xff0c;主机会唤醒cpu&#xff0c;使其运行CMOS中的BIOS&#xff0c;BIOS检查必要的硬件是否存在&#xff08;内存、硬盘等&#xff09;BIOS其实是一个小型系统&#xff0c;可以完成一些像检…

有关坐标系常见问题的问与答(转自ESRI中国社区)

本帖最后由 来生缘 于 2012-11-24 20:56 编辑坐标系是gis的灵魂&#xff0c;坐标系问题在桌面版是个永恒的主题&#xff0c;下面将常见的坐标系问题以问答的形式列出来&#xff0c;希望对大家有所帮助。问&#xff1a;我这有2个不同坐标的shp要素&#xff0c;这2个要素是同一地…

建议给予导师决定硕博士能否毕业的自主权?教育部:将充分采纳!

全世界只有3.14 % 的人关注了爆炸吧知识本文来源&#xff1a;教育部 近日&#xff0c;教育部官网公布了《对十三届全国人大三次会议第9546号建议的答复》。针对人大代表提出的关于完善高校研究生科研成果评价标准的建议&#xff0c;教育部作出回应&#xff0c;并透露了对加强研…

浅谈.Net异步编程的前世今生----APM篇

前言在.Net程序开发过程中&#xff0c;我们经常会遇到如下场景&#xff1a;编写WinForm程序客户端&#xff0c;需要查询数据库获取数据&#xff0c;于是我们根据需求写好了代码后&#xff0c;点击查询&#xff0c;发现界面卡死&#xff0c;无法响应。经过调试&#xff0c;发现查…

java打印三角形_java基础打印三角形

/*实心等边三角形*/class Triangle2{public static void main(String[] args){int n5;for(int i0;ifor(int j0;jSystem.out.print(" ");}for(int k0;kSystem.out.print("*");}System.out.println();}}}/*输出&#xff1a;**************************//*空心…

浅谈.Net异步编程的前世今生----TPL篇

前言我们在此前已经介绍了APM模型和EAP模型&#xff0c;以及它们的优缺点。在EAP模型中&#xff0c;可以实时得知异步操作的进度&#xff0c;以及支持取消操作。但是组合多个异步操作仍需大量工作&#xff0c;编写大量代码方可完成。因此&#xff0c;在.Net Framework 4.0中&am…