ASP.NET Core自定义中间件如何读取Request.Body与Response.Body的内容详解
![star](https://csdnimg.cn/release/downloadcmsfe/public/img/star.98a08eaa.png)
主要给大家介绍了关于在ASP.NET Core自定义中间件中如何读取Request.Body与Response.Body的内容,文中通过示例代码介绍的非常详细,对大家学习或者使用ASP.NET Core具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧 ASP.NET Core自定义中间件是框架提供的一种扩展点,允许开发者在请求生命周期的特定阶段插入自定义逻辑。本文将深入探讨如何在自定义中间件中读取`Request.Body`和`Response.Body`的内容。 `Request.Body`代表HTTP请求的主体部分,通常用于发送POST数据或文件上传。它是`Stream`类型的,可以读取请求的数据。在ASP.NET Core中,`StreamReader`通常用于从`Request.Body`中读取内容。然而,在实际操作中,一旦`Request.Body`被读取,原始流会被消耗掉,后续中间件无法再访问原始内容。为了解决这个问题,我们可以在读取内容后,将原始的`Stream`备份,然后恢复回去,以便后续的中间件能够正常工作。 ```csharp public async Task InvokeAsync(HttpContext context) { // 备份Request.Body var originalRequestBody = context.Request.Body; // 使用MemoryStream创建可读可写副本 using var requestBodyBackup = new MemoryStream(); context.Request.Body = requestBodyBackup; // 读取Request.Body var requestReader = new StreamReader(context.Request.Body); var requestContent = requestReader.ReadToEnd(); Console.WriteLine($"Request Body: {requestContent}"); // 恢复Request.Body context.Request.Body = originalRequestBody; // 继续执行下一个中间件 await _next(context); // Response.Body的问题 // ... } ``` 对于`Response.Body`,情况有所不同。在默认情况下,`Response.Body`是只写流,这意味着在中间件中无法读取其内容,因为`CanRead`属性为`false`。这可能导致在尝试读取时抛出`ArgumentException: Stream was not readable.`的异常。为了解决这个问题,我们需要创建一个可读可写的缓冲流来替代原始的`Response.Body`,并捕获处理后的响应内容。 ```csharp // 创建可读可写缓冲流 var originalResponseBody = context.Response.Body; context.Response.Body = new MemoryStream(); // 执行下一个中间件 await _next(context); // 获取Response.Body内容 context.Response.Body.Seek(0, SeekOrigin.Begin); var responseReader = new StreamReader(context.Response.Body); var responseContent = responseReader.ReadToEnd(); // 输出Response.Body Console.WriteLine($"Response Body: {responseContent}"); // 清空并恢复Response.Body context.Response.Body.Seek(0, SeekOrigin.Begin); context.Response.Body.Write(originalResponseBody.ToArray(), 0, (int)originalResponseBody.Length); context.Response.Body = originalResponseBody; ``` 这样的处理方式确保了我们可以在中间件中读取到`Request.Body`和`Response.Body`的内容,同时不会影响其他中间件的正常工作。在编写自定义中间件时,需要注意流的读写状态以及资源管理,避免出现意外的异常或数据丢失。 ASP.NET Core的中间件机制允许开发者灵活地处理HTTP请求和响应。通过正确地备份、读取和恢复`Request.Body`和`Response.Body`,我们可以在自定义中间件中实现对请求和响应数据的全面监控。这在开发日志记录、安全审计或其他需要拦截请求和响应数据的场景中特别有用。理解这些核心概念和技巧,能帮助开发者更好地利用ASP.NET Core构建高效、可维护的Web应用程序。
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![docx](https://img-home.csdnimg.cn/images/20210720083331.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![application/x-zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![docx](https://img-home.csdnimg.cn/images/20210720083331.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![azw3](https://img-home.csdnimg.cn/images/20210720083646.png)
![7z](https://img-home.csdnimg.cn/images/20210720083312.png)
![docx](https://img-home.csdnimg.cn/images/20210720083331.png)
![docx](https://img-home.csdnimg.cn/images/20210720083331.png)
![Rar](https://img-home.csdnimg.cn/images/20210720083646.png)
![](https://csdnimg.cn/release/download_crawler_static/12925822/bg1.jpg)
![avatar-default](https://csdnimg.cn/release/downloadcmsfe/public/img/lazyLogo2.1882d7f4.png)
- iostream10002020-11-26下载内容 https://www.cnblogs.com/lwqlun/p/10954936.html 就是这个博客 不知道为什么搞个pdf让人下载,真浪费钱。
![avatar](https://profile-avatar.csdnimg.cn/26e1359216624f84bdcffdcb714f7cc1_weixin_38643269.jpg!1)
- 粉丝: 2
- 资源: 902
我的内容管理 展开
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助
![voice](https://csdnimg.cn/release/downloadcmsfe/public/img/voice.245cc511.png)
![center-task](https://csdnimg.cn/release/downloadcmsfe/public/img/center-task.c2eda91a.png)
最新资源
- 打包和分发Rust工具.pdf
- SQL中的CREATE LOGFILE GROUP 语句.pdf
- C语言-leetcode题解之第172题阶乘后的零.zip
- C语言-leetcode题解之第171题Excel列表序号.zip
- C语言-leetcode题解之第169题多数元素.zip
- ocr-图像识别资源ocr-图像识别资源
- 图像识别:基于Resnet50 + VGG16模型融合的人体细胞癌症分类模型实现-图像识别资源
- C语言-leetcode题解之第168题Excel列表名称.zip
- C语言-leetcode题解之第167题两数之和II-输入有序数组.zip
- C语言-leetcode题解之第166题分数到小数.zip
![feedback](https://img-home.csdnimg.cn/images/20220527035711.png)
![feedback-tip](https://img-home.csdnimg.cn/images/20220527035111.png)
![dialog-icon](https://csdnimg.cn/release/downloadcmsfe/public/img/green-success.6a4acb44.png)