Flurl.Http集成Microsoft.Extensions.ServiceDiscovery

.Net8.0及以上版本,微软官方提供了服务发现NugetMicrosoft.Extensions.ServiceDiscovery,能够对 HttpClient 请求服务进行服务发现和解析,对于轻量级Flurl.Http 来说,也可以进行集成,主要思路是通过HttpClientFactory 构建HttpClient 实例,调用new FlurlClient(httpClientFactory.CreateClient()) 实现,以下具体介绍集成过程同时与常规的 HttpClient 写法做一个比较。

服务发现

引入依赖包

Microsoft.Extensions.ServiceDiscovery 当前对应版本为9.0.0。可以通过Nuget 管理器引入到项目中。

dotnet nuget add pack Microsoft.Extensions.ServiceDiscovery

基础配置服务

主类中主体结构如下:

public class Program{public static void Main(string[] args){var builder = WebApplication.CreateBuilder(args);// 注册服务IServiceCollection services = builder.Services;// 添加服务发现services.AddServiceDiscovery();// 设置httpclient构建添加服务发现services.ConfigureHttpClientDefaults(static http =>{// Turn on service discovery by defaulthttp.AddServiceDiscovery();});// 注册请求服务services.AddSingleton<MapClientService>();var app = builder.Build();app.MapControllers();app.Run();}

其中,AddServiceDiscovery() 注册服务发现。

builder.Services.AddServiceDiscovery();

MapClientService 实际请求处理类。

// 注册请求服务
services.AddSingleton<MapClientService>();

ConfigureHttpClientDefaults(static http =>{})添加全局HttpClient 实例应用服务发现。

// 设置httpclient构建添加服务发现
services.ConfigureHttpClientDefaults(static http =>
{// Turn on service discovery by defaulthttp.AddServiceDiscovery();
});

添加服务发现配置appsettings.json 根层级。

{"Services": {"mapservice": { // 服务名称"http": [ // http请求"192.168.31.116:6003" // 服务实际服务地址和端口]}}
}

请求实现类

普通工厂创建实例

private readonly MapOptions _options;
private readonly IDistributedCache _cache;
private readonly IHttpClientFactory _httpClientFactory;
public MapClientService(IOptions<MapOptions> map,IDistributedCache cache,IHttpClientFactory httpClientFactory)
{_options = map?.Value;_cache = cache;_httpClientFactory = httpClientFactory;
}
// 请求服务地址(期望通过服务发现进行解析)
private const string _url = "http://mapservice";
public const string token = "/api/identity/token";
public async Task<string> Token()
{string key =  _cache.GetString(token);if (key == null) {var data = new{grantType = "password",account = _options.Uname,password = _options.Pwd};// 构建请求--------------------------------------------------HttpClient httpClient = _httpClientFactory.CreateClient();httpClient.DefaultRequestHeaders.Add("Authorization", $"Bearer {token}");HttpRequestMessage httpRequest = new HttpRequestMessage();httpRequest.Method = HttpMethod.Post;httpRequest.RequestUri = new Uri($"{_url}{updateMapState}");httpRequest.Content = new StringContent(JsonSerializer.Serialize(data));httpRequest.Content.Headers.ContentType = new MediaTypeHeaderValue("application/json");HttpResponseMessage httpResponse = await httpClient.SendAsync(httpRequest);var msg = await httpResponse.Content.ReadAsStringAsync();AjaxResult<TokenResult> result = JsonSerializer.Deserialize<AjaxResult<TokenResult>>(msg);if (result.Type == 200){key = result.Data.AccessToken;_cache.SetString(token, key,new DistributedCacheEntryOptions { AbsoluteExpirationRelativeToNow = TimeSpan.FromSeconds(300)});}}return key;
}

运行输入日志如下:

info: System.Net.Http.HttpClient.Default.LogicalHandler[100]Start processing HTTP request POST http://mapservice/api/urlmap/updateurlmapstate
info: System.Net.Http.HttpClient.Default.ClientHandler[100]Sending HTTP request POST http://192.168.31.116:6003/api/urlmap/updateurlmapstate

使用Flurl.Http请求

直接使用Flurl.Http 对之前的HttpClientFactory 进行改造。

using Flurl.Http;private readonly MapOptions _options;
private readonly IDistributedCache _cache;
private readonly IFlurlClient _flurlClient;
public MapClientService(IOptions<MapOptions> map,IDistributedCache cache)
{_options = map?.Value;_cache = cache;
}
// 请求服务地址(期望通过服务发现进行解析)
private const string _url = "http://mapservice";
public const string token = "/api/identity/token";
public async Task<string> Token()
{string key =  _cache.GetString(token);if (key == null) {var data = new{grantType = "password",account = _options.Uname,password = _options.Pwd};// 构建请求--------------------------------------------------var result = await $"{_url}{token}".PostJsonAsync(data).ReceiveJson<AjaxResult<TokenResult>>();if (result.Type == 200){key = result.Data.AccessToken;_cache.SetString(token, key,new DistributedCacheEntryOptions { AbsoluteExpirationRelativeToNow = TimeSpan.FromSeconds(300)});}}return key;
}

通过FlurlClient并支持服务发现

private readonly MapOptions _options;
private readonly IDistributedCache _cache;
private readonly IFlurlClient _flurlClient;
public MapClientService(IOptions<MapOptions> map,IDistributedCache cache,IHttpClientFactory httpClientFactory)
{_options = map?.Value;_cache = cache;_flurlClient = new FlurlClient(httpClientFactory.CreateClient());
}
// 请求服务地址(期望通过服务发现进行解析)
private const string _url = "http://mapservice";
public const string token = "/api/identity/token";
public async Task<string> Token()
{string key =  _cache.GetString(token);if (key == null) {var data = new{grantType = "password",account = _options.Uname,password = _options.Pwd};// 构建请求--------------------------------------------------var result = await _flurlClient.Request($"{_url}{token}").PostJsonAsync(data).ReceiveJson<AjaxResult<TokenResult>>();if (result.Type == 200){key = result.Data.AccessToken;_cache.SetString(token, key,new DistributedCacheEntryOptions { AbsoluteExpirationRelativeToNow = TimeSpan.FromSeconds(300)});}}return key;
}

运行项目,程序输入如下,与HttpClientFactory 构建实例发起请求输出一致。

info: System.Net.Http.HttpClient.Default.LogicalHandler[100]Start processing HTTP request POST http://mapservice/api/identity/token2
info: System.Net.Http.HttpClient.Default.ClientHandler[100]Sending HTTP request POST http://192.168.31.116:6003/api/identity/token2

可以发现,对应请求日志输出,两者并无差异,也能够成功解析,表示通过IHttpClientFactory 构建实例能够与Flurl.Http 中进行集成。既简化了简单的接口请求,又能够使用HttpClient 官方提供的一些扩展功能。

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

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

相关文章

并非简易SE

这个作业属于哪个课程 https://edu.cnblogs.com/campus/fzu/SE2024这个作业要求在哪里 https://edu.cnblogs.com/campus/fzu/SE2024/homework/13315这个作业的目标 总结回顾这一学期的收获学号 052101418一、学期回顾 在这学期的软工实践课程中,我经历了诸多挑战,也收获了宝贵…

.NET周刊【12月第4期 2024-12-22】

国内文章 dotnet 简单使用 ICU 库进行分词和分行 https://www.cnblogs.com/lindexi/p/18622917 本文将和大家介绍如何使用 ICU 库进行文本的分词和分行。 dotnet 简单聊聊 Skia 里的 SKFontMetrics 的各项属性作用 https://www.cnblogs.com/lindexi/p/18621674 本文将和大家简单…

python-nmap实现python利用nmap扫描分析

Nmap是一个非常用的网络/端口扫描工具,如果想将nmap集成进你的工具里。可以使用python-nmap这个python库,它提供了一个简单的接口来使用nmap进行扫描。目录前言python-nmap的基本使用PortScanner扫描PortScannerAsync异步扫描python-nmap的源码分析 前言 Nmap是一个非常用的网…

风继续吹

风继续吹 一、学期回顾 1.1 回顾你对于软件工程课程的想象 在学期初,我对软件工程课程没多少了解,觉得它应该和之前的部分课程一样,老师讲解一些编程语法然后布置作业,后期周末去实验室编程完成实验,期末再复习一下这门课编写代码作答题目这门课也就过去了。但实际上的软工…

初识Spring -2024/12/30

Spring优点Spring FrameworkCore Container:核心容器 AOP:面向切面编程 Aspects: AOP思想实现 Data Access :数据访问 Data Integration: 数据集成IoC,IoC容器,Bean,DI导入依赖 <dependency><groupId>org.springframework</groupId><artifactId>spring…

【Leetcode】链表

链表 160. 相交链表 206. 反转链表 234. 回文链表 141. 环形链表 142. 环形链表 II 21. 合并两个有序链表 2. 两数相加 19. 删除链表的倒数第 N 个结点 25. K 个一组翻转链表 138. 随机链表的复制 148. 排序链表 23. 合并 K 个升序链表 146. LRU 缓存 160. 相交链表 方法一:模…

The end-软工实践之旅

一、学期回顾 1.1 回顾你对于软件工程课程的想象 在学期初,我眼中的软件工程课程是一门教大家如何从零开始开发软件,实际上大部分知识都需要自己学习掌握,软工课着重系统地学习软件开发流程,掌握从需求分析、设计、编码到测试的全套本领,雕琢出实用且受欢迎的软件作品。 如…

‍禁止蕉绿——软件工程个人总结

这个作业属于哪个课程 软件工程这个作业要求在哪里 软件工程2024秋——个人总结作业这个作业的目标 学期总结学号 102202150🙅‍禁止焦虑——2024秋软工实践个人总结博客 一、🎞️学期回顾🎞️ 1.1 💭回顾你对于软件工程课程的想象💭 刚开始我对软件工程的理解只局限…

《计算机组成及汇编语言原理》阅读笔记:p133-p159

《计算机组成及汇编语言原理》学习第 11 天,p133-p159 总结,总计 27 页。 一、技术总结 1.segment (1)定义 Broadly speaking, a contiguous section of memory. More specifically, a section of memory referenced by one of the segment registers of the 80x86 family.…

并非银河战舰,皮划艇也能启航

目录标题一、学期回顾1.1 回顾对软工课程的想象1.2 回顾在这门课程中的投入与产出1.3 最印象深刻的答辩二、总结收获2.1 自己的人月神话2.2 学习到的新技术和生产力工具2.3 除了技术之外,还得到了哪些提升2.4 对下一届实践的建议三、致谢这个作业属于哪个课程 https://edu.cnb…

GitHub Copilot免费上线!快速上手指南与功能解析

GitHub Copilot在12月宣布免费订阅,不再限制学生和开源项目的维护者了,对于习惯白嫖的开发者来说无疑多了一个选择。 价格和功能 免费版目前可以选择Claude 3.5 Sonnet或GPT-4o模型,每月可以调用 2000 次生成和补全代码,以及 50 次聊天信息。快速开始注册一个GIthub账号 VS…

C#/.NET/.NET Core技术前沿周刊 | 第 19 期(2024年12.23-12.29)

前言 C#/.NET/.NET Core技术前沿周刊,你的每周技术指南针!记录、追踪C#/.NET/.NET Core领域、生态的每周最新、最实用、最有价值的技术文章、社区动态、优质项目和学习资源等。让你时刻站在技术前沿,助力技术成长与视野拓宽。欢迎投稿、推荐或自荐优质文章、项目、学习资源等…