ASP.NET Core扩展库之Http通用扩展
本文将介绍Xfrogcn.AspNetCore.Extensions扩展库对于Http相关的其他功能扩展,这些功能旨在处理一些常见需求, 包括请求缓冲、请求头传递、请求头日志范围、针对HttpClient与HttpRequestMessage、HttpResponseMessage的扩展方法。
一、开启服务端请求缓冲
ASP.NET Core 中请求体是不能多次读取的,由于在MVC中,框架已经读取过请求体,如果你在控制器中再次读取,将会引发异常,如下示例:
[ApiController]
[Route("[controller]")]
public class TestController : ControllerBase
{
public TestController()
{
}
[HttpPost]
public async Task<WeatherForecast> Save([FromBody]WeatherForecast enttiy)
{
using (StreamReader reader = new StreamReader(Request.Body))
{
Request.Body.Position = 0;
string response = await reader.ReadToEndAsync();
}
return enttiy;
}
}
当通过Post请求/test接口时,语句 Request.Body.Position 将触发异常:
System.NotSupportedException: Specified method is not supported.
at Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http.HttpRequestStream.set_Position(Int64 value)
当然,实际中可能不会像示例这样处理请求,但在业务需求中,的确可能会有多次读取请求体的情况出现。
通过开启请求缓冲可以解决多次读取请求体的问题,Xfrogcn.AspNetCore.Extensions扩展库提供了EnableBufferingAttribute特性用于开启请求缓冲,你可以将此特性用于控制器或者Action方法。
以上示例,只需在Save方法上添加EnableBuffering特性:
[HttpPost]
[EnableBuffering]
public async Task<WeatherForecast> Save([FromBody]WeatherForecast enttiy)
{
....
}
二、请求头传递
微服务架构下,通常我们使用请求头来实现请求的链路跟踪以及日志与请求的关联,例如,通过x-request-id,在日志系统中可以直接查看某一个请求在所有服务中的相关日志。
扩展库通过拦截HttpClient请求管道,可实现对指定请求头的自动传递。默认配置下,扩展库会自动传递以"x-"开始的请求头,如果你需要传递其他的请求头,可通过配置中的TrackingHeaders来添加。
IServiceCollection services = new ServiceCollection()
.AddExtensions(null, config =>
{
// 自动传递以my-为前缀的请求头
config.TrackingHeaders.Add("my-*");
});
三、请求头日志的记录
.NET Core日志框架中,实现了日志范围的概念,通过日志范围,可以让日志系统记录当前上下文的信息,例如,ASP.NET Core MVC中,日志范围包含ActionContext相关信息,故可以在一个请求的所有日志中都可自动记录Action的相关信息。
扩展库可以将配置的请求头加入请求的日志范围,例如,默认配置下,扩展库会将x-request-id加入到请求的日志范围,所以在单一请求中的所有日志,都可自动携带x-request-id信息,以此实现跨服务的日志关联。要包含其他的请求头,可以通过配置中的HttpHeaders来设置:
IServiceCollection services = new ServiceCollection()
.AddExtensions(null, config =>
{
// 将my-id请求头包含到日志范围
config.HttpHeaders.Add("my-id");
});
注意: 默认的控制台日志、文件日志不会保存日志范围的相关信息,你可以使用json格式的控制台日志或文件日志,在此格式下将保存日志范围中的数据。
IServiceCollection services = new ServiceCollection()
.AddExtensions(null, config =>
{
config.ConsoleJsonLog = true;
});
四、Http消息上的扩展方法
扩展库在HttpRequestMessage上提供了GetObjectAsync、WriteObjectAsync扩展方法,以便于对请求消息的读写。 在HttpResponseMessage上提供了GetObjectAsync、WriteObjectAsync扩展方法,以便于对应答消息的读写。这些方法都采用json格式。
示例:
public class WeatherForecast
{
public DateTime Date { get; set; }
public int TemperatureC { get; set; }
public int TemperatureF => 32 + (int)(TemperatureC / 0.5556);
public string Summary { get; set; }
}
static async Task Main(string[] args)
{
IServiceCollection services = new ServiceCollection()
.AddExtensions(null, config =>
{
});
IServiceProvider serviceProvider = services.BuildServiceProvider();
IHttpClientFactory factory = serviceProvider.GetRequiredService<IHttpClientFactory>();
HttpClient client = factory.CreateClient();
HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Post, "http://localhost:5000/test");
// 写入请求对象
await request.WriteObjectAsync(new WeatherForecast()
{
Date = DateTime.Now
});
request.Content.Headers.ContentType = new MediaTypeHeaderValue("application/json");
// 读取请求对象
var entity = await request.GetObjectAsync<WeatherForecast>();
HttpResponseMessage response = await client.SendAsync(request);
// 读取应答对象
entity = await response.GetObjectAsync<WeatherForecast>();
Console.ReadLine();
}
五、HttpClient上的扩展方法
为了更方便快捷地使用HttpClient,扩展库在HttpClient上增加了多个扩展方法:
- PostAsync<TResponse>: 发送对象到服务端,并获取指定类型的应答
- PostAsync: 发送对象到服务端,并获取应答字符串
- GetAsync<TResponse>: 发送Get请求,并获取TResponse类型的应答
- GetAsync: 发送Get请求,并获取String类型的应答
- SubmitFormAsync<TResponse>: 向服务器提交表单数据,并获取TResponse类型的应答
- SubmitFormAsync: 向服务器提交表单数据,并获取String类型的应答
- UploadFileAsync<TResponse>: 上次本地文件
- UploadStreamAsync<TResponse>: 上传流数据到服务器
有关这些扩展方法的详细说明,可参考文档 GitHub Gitee
Xfrogcn.AspNetCore.Extensions地址:GitHub Gitee
ASP.NET Core扩展库之Http通用扩展的更多相关文章
- ASP.NET Core - 利用Windsor Castle实现通用注册
问题引入 在ASP.NET Core - 依赖注入这篇文章里面,我们知道了如何利用ASP.NET Core原生的容器来实现依赖注入的,那我们为什么要替换掉默认的 IoC容器呢?从ASP.NET Cor ...
- asp.net core实时库:SignalR(1)
SignalR的基本概念 前言 最近在自己的项目中实践了SignalR的使用,asp.net core 2.1版本的时候建立了对SignalR的支持,SignalR的可使用Web Socket, Se ...
- 基于ASP.Net Core开发的一套通用后台框架
基于ASP.Net Core开发一套通用后台框架 写在前面 这是本人在学习的过程中搭建学习的框架,如果对你有所帮助那再好不过.如果您有发现错误,请告知我,我会第一时间修改. 知其然,知其所以然,并非重 ...
- 第十六节:Asp.Net Core中Session的使用、扩展、进程外Session
一. 简介 关于Session的原理可参照Asp.Net版本Session的文章,去查阅. 1. 普通用法 (1).通过Nuget引入[Microsoft.AspNetCore.Http]程序集,Co ...
- windows 下编译php扩展库pecl里的扩展memcache
Memcache是一个高性能的分布式的内存对象缓存系统,通过在内存里维护一个统一的巨大的hash表,它能够用来存储各种格式的数据,包括图像.视频.文件以及数据库检索的结果等.简单的说就是将数据调用到内 ...
- asp.net core 3.x 通用主机原理及使用
一.前言 只是讲asp.net core 3.x通用主机的大致原理,这些东西是通过查看源码以及自己根据经验总结得来的,在文章中不会深入源码,因为个人觉得懂原理就晓得扩展点,后期碰到有需求的时候再仔细去 ...
- ASP.NET Core 十种方式扩展你的 Views
原文地址:http://asp.net-hacker.rocks/2016/02/18/extending-razor-views.html 作者:Jürgen Gutsch 翻译:杨晓东(Savor ...
- 探索 ASP.Net Core 3.0系列五:引入IHostLifetime并弄清Generic Host启动交互
前言:在本文中,我将介绍如何在通用主机之上重新构建ASP.NET Core 3.0,以及由此带来的一些好处. 同时也展示了3.0中引入新的抽象类IHostLifetime,并描述了它在管理应用程序(尤 ...
- ASP.NET Core 运行原理剖析
1. ASP.NET Core 运行原理剖析 1.1. 概述 1.2. 文件配置 1.2.1. Starup文件配置 Configure ConfigureServices 1.2.2. appset ...
随机推荐
- 【PY从0到1】 一文掌握Pandas量化基础
# 2[PY从0到1] 一文掌握Pandas量化基础 # Numpy和pandas是什么关系呢? # 在我看来,np偏向于数据细节处理,pd更偏向于表格整体的处理. # 要记住的pd内部的数据结构采用 ...
- 从微信小程序到鸿蒙js开发【06】——swiper&animator&marquee
目录: 1.swiper轮播图 2.image-animator幻灯片 3.marquee跑马灯 4.nginx动静分离 1.swiper轮播图 微信小程序的swiper组件中只能放置swiper-i ...
- ASM的基础用法
本文转载自ASM的基础用法 导语 新闻里使用的热补丁修复方案是基于AspectJ,AspectJ是AOP的一种实现. 无意接触到一种小巧轻便的Java字节码操控框架ASM,它也能方便地生成和改造Jav ...
- epoll原理详解及epoll反应堆模型
本文转载自epoll原理详解及epoll反应堆模型 导语 设想一个场景:有100万用户同时与一个进程保持着TCP连接,而每一时刻只有几十个或几百个TCP连接是活跃的(接收TCP包),也就是说在每一时刻 ...
- 后端程序员之路 53、A Tour of Go-3
#method - Methods - Go does not have classes. However, you can define methods on types. ...
- SpringMVC-03 RestFul和控制器
SpringMVC-03 RestFul和控制器 控制器Controller 控制器复杂提供访问应用程序的行为,通常通过接口定义或注解定义两种方法实现. 控制器负责解析用户的请求并将其转换为一个模型. ...
- dubbo实战之四:管理控制台dubbo-admin
欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...
- WPF 应用 - 图表 LiveCharts
引用:LiveCharts,LiveCharts.Wpf 1. 示例 折线图 <Window ... xmlns:lvc="clr-namespace:LiveCharts.Wpf;a ...
- 《Selenium自动化测试实战:基于Python》Selenium自动化测试框架入门
第1章 Selenium自动化测试框架入门 1.1 Selenium自动化测试框架概述 说到目前流行的自动化测试工具,相信只要做过软件测试相关工作,就一定听说过Selenium. 图1-1是某企业 ...
- 攻防世界 reverse 进阶 easyre-153
easyre-153 查壳: upx壳 脱壳: 1 int __cdecl main(int argc, const char **argv, const char **envp) 2 { 3 int ...