博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
ASP.NET Core 中读取 Request.Body 的正确姿势
阅读量:6241 次
发布时间:2019-06-22

本文共 1472 字,大约阅读时间需要 4 分钟。

ASP.NET Core 中的 Request.Body 虽然是一个 Stream ,但它是一个与众不同的 Stream —— 不允许 Request.Body.Position=0 ,这就意味着只能读取一次,要想多次读取,需要借助 MemoryStream ,详见博问  

using (var buffer = new MemoryStream()){    Request.Body.CopyTo(buffer);    buffer.Position = 0;    buffer.CopyTo(writer.BaseStream);    Console.WriteLine("Request.Body:");    buffer.Position = 0;    buffer.CopyTo(Console.OpenStandardOutput());}

昨天读了博文  之后得知在 ASP.NET Core 2.0 中已经针对这个问题提供了解决方法 —— EnableRewind() ,只要启用倒带功能,就可以让  Request.Body 回归正常 Stream 。

使用非常简单,引用命名空间 Microsoft.AspNetCore.Http.Internal ,调用方法 Request.EnableRewind()  即可,下面我们用简单的示例代码体验一下

public class HomeController : Controller{    public IActionResult Index()    {        Request.EnableRewind();        Console.WriteLine("Request.Body1:");        Request.Body.Position = 0;        Request.Body.CopyTo(Console.OpenStandardOutput());        Console.WriteLine();        Console.WriteLine("Request.Body2:");        Request.Body.Position = 0;        Request.Body.CopyTo(Console.OpenStandardOutput());        Console.WriteLine();        return Ok();    }}

启动上面的 ASP.NET Core 站点,然后用 curl 命令发出请求

curl -X POST -d 'Hello World' localhost:5000

控制台就会输出期望的结果

Request.Body1:Hello WorldRequest.Body2:Hello World

EnableRewind 有 2 个参数 bufferThreshold 与 bufferLimit 。 bufferThreshold 设置的是 Request.Body 最大缓存字节数(默认是30K),超出这个阈值的字节会被写入磁盘;bufferLimit 设置的是 Request.Body 允许的最大字节数(默认值是null),超出这个限制,就会抛出异常  System.IO.IOException 。

EnableRewind 的实现源代码见 

转载于:https://www.cnblogs.com/dudu/p/9190747.html

你可能感兴趣的文章
在Linux下配置git并设置远程仓库
查看>>
[解题报告]499 - What's The Frequency, Kenneth?
查看>>
Vue入门---常用指令详解
查看>>
iOS 越狱后 SSH 不能连接
查看>>
soj 3291 Distribute The Apples II DP
查看>>
苹果App Store审核指南中文翻译(更新至140227)
查看>>
转 -- OK6410 tftp下载内核、文件系统以及nand flash地址相关整理、总结
查看>>
原来对MFC一无所知
查看>>
Java程序员看C++代码
查看>>
python处理Excel - xlrd xlwr openpyxl
查看>>
JS实现的购物车
查看>>
bzoj 3998 [TJOI2015]弦论——后缀自动机
查看>>
STL 的 vector 根据元素的值来删除元素的方法
查看>>
NOI2002银河英雄传说——带权并查集
查看>>
复合数据类型,英文词频统计
查看>>
“main cannot be resolved or is not a field”解决方案
查看>>
oc中使用switch实现图片浏览功能,补充其它的实现方式
查看>>
6、DRN-----深度强化学习在新闻推荐上的应用
查看>>
用父类指针指向子类对象
查看>>
Flexigrid默认是可以选择多行
查看>>