没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
全文可编辑 word 文档 页眉与背景水印可删除
1
ASP.NET Core 读取 Request.Body 的正确方
法
目录
前言常用读取方式同步读取异步读取重复读取源码探
究 StreamReader 和 Stream 的 关 系 HttpRequest 的
BodyAllowSynchronousIO 本质来源 EnableBuffering 神奇的
背后总结
前言
常用读取方式
同步读取
异步读取
重复读取
源码探究
StreamReader 和 Stream 的 关 系 HttpRequest 的
BodyAllowSynchronousIO 本质来源 EnableBuffering 神奇的
背后
StreamReader 和 Stream 的关系
HttpRequest 的 Body
AllowSynchronousIO 本质来源
EnableBuffering 神奇的背后
全文可编辑 word 文档 页眉与背景水印可删除
2
总结
前言
相信大家在使用 ASP.NET Core 进行开发的时候,肯定会
涉及到读取 Request.Body 的场景,毕竟我们大部分的 POST
请求都是将数据存放到 Http 的 Body 当中。因为笔者日常开
发所使用的主要也是 ASP.NET Core 所以笔者也遇到这这种
场景,关于本篇文章所套路的内容,来自于在开发过程中我
遇到的关于 Request.Body 的读取问题。在之前的使用的时
候,基本上都是借助搜索引擎搜索的答案,并没有太关注这
个,发现自己理解的和正确的使用之间存在很大的误区。故
有感而发,便写下此文,以作记录。学无止境,愿与君共勉。
常用读取方式
当我们要读取 Request Body 的时候,相信大家第一直觉
和笔者是一样的,这有啥难的,直接几行代码写完,这里我
们 模 拟 在 Filter 中 读 取 Request Body , 在 Action 或
Middleware 或其他地方读取类似,有 Request 的地方就有
Body,如下所示
public override void
OnActionExecuting(ActionExecutingContext context)
{
//在 ASP.NET Core 中 Request Body 是 Stream
的形式
全文可编辑 word 文档 页眉与背景水印可删除
3
StreamReader stream = new
StreamReader(context.HttpContext.Request.Body);
string body = stream.ReadToEnd();
_logger.LogDebug("body content:" + body);
base.OnActionExecuting(context);
}
写完之后,也没多想,毕竟这么常规的操作,信心满满,
运 行 起 来 调 试 一 把 , 发 现 直 接 报 一 个 这 个 错
System.InvalidOperationException: Synchronous
operations are disallowed. Call ReadAsync or set
AllowSynchronousIO to true instead.大致的意思就是同步
操 作 不 被 允 许 , 请 使 用 ReadAsync 的 方 式 或 设 置
AllowSynchronousIO 为 true 。 虽 然 没 说 怎 么 设 置
AllowSynchronousIO,不过我们借助搜索引擎是我们最大的
强项。
同步读取
首先我们来看设置 AllowSynchronousIO 为 true 的方式,
看名字也知道是允许同步 IO,设置方式大致有两种,待会我
们会通过源码来探究一下它们直接有何不同,我们先来看一
下如何设置 AllowSynchronousIO 的值。第一种方式是在
ConfigureServices 中配置,操作如下
全文可编辑 word 文档 页眉与背景水印可删除
4
services.Configure<KestrelServerOptions>(options =>
{
options.AllowSynchronousIO = true;
});
这种方式和在配置文件中配置 Kestrel 选项配置是一样
的只是方式不同,设置完之后即可,运行不在报错。还有一
种方式,可以不用在 ConfigureServices 中设 置, 通过
IHttpBodyControlFeature 的方式设置,具体如下
public override void
OnActionExecuting(ActionExecutingContext context)
{
var syncIOFeature =
context.HttpContext.Features.Get<IHttpBodyControlFe
ature>();
if (syncIOFeature != null)
{
syncIOFeature.AllowSynchronousI
O = true;
}
StreamReader stream = new
StreamReader(context.HttpContext.Request.Body);
string body = stream.ReadToEnd();
全文可编辑 word 文档 页眉与背景水印可删除
5
_logger.LogDebug("body content:" + body);
base.OnActionExecuting(context);
}
这种方式同样有效,通过这种方式操作,不需要每次读
取 Body 的时候都去设置,只要在准备读取 Body 之前设置一
次即可。这两种方式都是去设置 AllowSynchronousIO 为 true,
但是我们需要思考一点,微软为何设置 AllowSynchronousIO
默认为 false,说明微软并不希望我们去同步读取 Body。通
过查找资料得出了这么一个结论
Kestrel:默认情况下禁用 AllowSynchronousIO(同步
IO),线程不足会导致应用崩溃,而同步 I/O API(例如
HttpRequest.Body.Read)是导致线程不足的常见原因。
由此可以知道,这种方式虽然能解决问题,但是性能并
不是不好,微软也不建议这么操作,当程序流量比较大的时
候,很容易导致程序不稳定甚至崩溃。
异步读取
通过上 面 我 们 了 解 到 微软并不希 望 我 们 通 过 设 置
AllowSynchronousIO 的方式去操作,因为会影响性能。那我
们可以使用异步的方式去读取,这里所说的异步方式其实就
是使用 Stream 自带的异步方法去读取,如下所示
public override void
OnActionExecuting(ActionExecutingContext context)
剩余48页未读,继续阅读
资源评论
mmoo_python
- 粉丝: 0
- 资源: 1万+
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- WS2-32.lib,在编译程序中可以链接使用
- 秒懂傅里叶变换matlab程序实现过程
- ZEND解密dezender12
- sony 索尼IMX334摄像头模组电路板AD版硬件PCB图(6层板).zip
- 基于flask和echarts融合交易策略的bitfinex可视化微服务.zip
- 包含了wvp-assist.tar wvp-talk.tar zlmediakit.tar .
- 3r4efgh53wgrf43tw
- 2024新版Java基础从入门到精通全套视频+资料下载
- Spring AI大模型视频教程+ChatGPT视频教程+OpenAI大模型视频教程(资料+视频教程)
- ABB工业机器人教程PDF版本
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功