本文将介绍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通用扩展的更多相关文章

  1. ASP.NET Core - 利用Windsor Castle实现通用注册

    问题引入 在ASP.NET Core - 依赖注入这篇文章里面,我们知道了如何利用ASP.NET Core原生的容器来实现依赖注入的,那我们为什么要替换掉默认的 IoC容器呢?从ASP.NET Cor ...

  2. asp.net core实时库:SignalR(1)

    SignalR的基本概念 前言 最近在自己的项目中实践了SignalR的使用,asp.net core 2.1版本的时候建立了对SignalR的支持,SignalR的可使用Web Socket, Se ...

  3. 基于ASP.Net Core开发的一套通用后台框架

    基于ASP.Net Core开发一套通用后台框架 写在前面 这是本人在学习的过程中搭建学习的框架,如果对你有所帮助那再好不过.如果您有发现错误,请告知我,我会第一时间修改. 知其然,知其所以然,并非重 ...

  4. 第十六节:Asp.Net Core中Session的使用、扩展、进程外Session

    一. 简介 关于Session的原理可参照Asp.Net版本Session的文章,去查阅. 1. 普通用法 (1).通过Nuget引入[Microsoft.AspNetCore.Http]程序集,Co ...

  5. windows 下编译php扩展库pecl里的扩展memcache

    Memcache是一个高性能的分布式的内存对象缓存系统,通过在内存里维护一个统一的巨大的hash表,它能够用来存储各种格式的数据,包括图像.视频.文件以及数据库检索的结果等.简单的说就是将数据调用到内 ...

  6. asp.net core 3.x 通用主机原理及使用

    一.前言 只是讲asp.net core 3.x通用主机的大致原理,这些东西是通过查看源码以及自己根据经验总结得来的,在文章中不会深入源码,因为个人觉得懂原理就晓得扩展点,后期碰到有需求的时候再仔细去 ...

  7. ASP.NET Core 十种方式扩展你的 Views

    原文地址:http://asp.net-hacker.rocks/2016/02/18/extending-razor-views.html 作者:Jürgen Gutsch 翻译:杨晓东(Savor ...

  8. 探索 ASP.Net Core 3.0系列五:引入IHostLifetime并弄清Generic Host启动交互

    前言:在本文中,我将介绍如何在通用主机之上重新构建ASP.NET Core 3.0,以及由此带来的一些好处. 同时也展示了3.0中引入新的抽象类IHostLifetime,并描述了它在管理应用程序(尤 ...

  9. ASP.NET Core 运行原理剖析

    1. ASP.NET Core 运行原理剖析 1.1. 概述 1.2. 文件配置 1.2.1. Starup文件配置 Configure ConfigureServices 1.2.2. appset ...

随机推荐

  1. django学习-19.admin管理后台的配置和登录

    目录结构 1.前言 2.admin管理后台的配置和登录的完整操作流程 2.1.第一步: 在[settings.py]里对常量[INSTALLED_APPS]的值进行相关配置 2.2.第二步: 在[ur ...

  2. pytorch resnet实现

    官方github上已经有了pytorch基础模型的实现,链接 但是其中一些模型,尤其是resnet,都是用函数生成的各个层,自己看起来是真的难受! 所以自己按照caffe的样子,写一个pytorch的 ...

  3. Jmeter beanshell编程实例

    1.引言 BeanShell是一种小型的,免费的,可嵌入的符合Java语法规范的源代码解释器,具有对象脚本语言特性. 在Jmeter实践中,由于BeanShell组件较高的自由度,通常被用来处理较为复 ...

  4. Dev GridControl列绑定LookUpEdit数据源:默认值

    在Winform开发过程中,GridControl控件是比较常见的,尤其是其数据源的灵活性,为我们提供了不少的便利. 在使用Dev的GridControl的时候,有时候会在列的Column Edit属 ...

  5. 第46天学习打卡(四大函数式接口 Stream流式计算 ForkJoin 异步回调 JMM Volatile)

    小结与扩展 池的最大的大小如何去设置! 了解:IO密集型,CPU密集型:(调优)  //1.CPU密集型 几核就是几个线程 可以保持效率最高 //2.IO密集型判断你的程序中十分耗IO的线程,只要大于 ...

  6. R语言低级绘图函数画个温度计

    x <- 1:2 y <- runif(2,0,100) par(mar=c(4,6,2,6)) plot(x,y,type="n",xlim=c(0.5,2.5),y ...

  7. Git:使用远程仓库

    远程仓库可使用Github.Gitee,或自建Gitlab.Gogs服务器,这里使用Github. 配置本地用户名和邮箱 # 配置本地用户的用户名邮箱(保存在用户.gitconfig文件) $ git ...

  8. Fedora一键安装NVIDIA显卡驱动Fedora28+

    这是一篇以前写的文章,写在CSDN的,现在不想使用CSDN了,就把笔记写在了博客源,后续考虑建立自己的博客,每一个CRUD程序员都想建立自己的博客吧,我猜是的 进入正题 rpm fusion源包含Nv ...

  9. C# 应用 - 使用 HttpWebRequest 发起 Http 请求

    helper 类封装 调用 1. 引用的库类 \Reference Assemblies\Microsoft\Framework\.NETFramework\v4.6\System.dll Syste ...

  10. Kotlin/Java Base64编码和解码(图片、文件)

    原文: Kotlin/Java Base64编码和解码(图片.文件) | Stars-One的杂货小窝 最近在项目中使用到了Base64编码和解码,便是稍微写篇文章记录一下 PS:本文代码都是使用Ko ...