当前位置: 首页 > article >正文

DotNetPy:现代.NET 与 Python 互操作 实战指南概

我为什么会发出这个疑问呢是因为我研究Web开发中的一个问题时HTTP请求体在 Filter过滤器处被读取了之后在 Controller控制层就读不到值了使用 RequestBody 的时候。无论是字节流InputStream / OutputStream还是字符流Reader / Writer所有基于流的读取操作都会维护一个 位置指针。初始状态下指针指向流的起始位置position 0每次调用 read() / read(byte[]) / read(char[]) 等读取方法时指针会向后移动对应字节数当指针移动到流的末尾没有更多数据read() 方法会返回 -1表示流读取完毕指针移动后不会自动回退也无法反向移动除非流显式支持重置因此再次读取只能得到 -1。类比IO 流的读取过程就像用 磁带播放器听磁带 —— 磁头对应流的位置指针从磁带开头指针 0开始移动每读一个字节 / 字符磁头就往后走一步当磁头走到磁带末尾再继续播放读取就只能听到 沙沙声流返回 -1并且磁头不会自动回到开头。当然不是所有流都只能读一次基于内存的流如 ByteArrayInputStream / CharArrayReader支持重置指针因为它们的数据源是内存中的数组数据不会消失可以通过 mark() 和 reset() 方法将指针 恢复 到标记位置。需要注意调用 reset() 前必须先调用 mark(int readlimit)不是所有流都支持 mark() / reset()可以通过 inputStream.markSupported() 来进行判断。使用 mark() 和 reset() 方法// 仅适用于支持mark的流public void processWithMark(InputStream input) throws IOException {if (!input.markSupported()) {throw new IOException(Mark not supported);}// 标记当前位置参数100表示最多可回退100字节input.mark(100);// 第一次读取byte[] firstRead new byte[50];input.read(firstRead);System.out.println(First read: new String(firstRead));// 重置到标记位置input.reset();// 第二次读取相同内容byte[] secondRead new byte[50];input.read(secondRead);System.out.println(Second read: new String(secondRead));}使用 包装类 解决上文我们提到的 HTTP请求体多次读取 的问题public class MyRequestWrapper extends HttpServletRequestWrapper {private final byte[] body; // 缓存请求体的字节数组public MyRequestWrapper(HttpServletRequest request) throws IOException {super(request);// 关键步骤在构造时一次性读取并存储原始请求流body StreamUtils.copyToByteArray(request.getInputStream());}// 提供一个便捷方法用于在过滤器中获取请求体内容例如记录日志// 使用时直接调用 getBodyString() 即可public String getBodyString() throws UnsupportedEncodingException {return new String(body, this.getCharacterEncoding());}Overridepublic ServletInputStream getInputStream() throws IOException {// 每次调用都返回一个基于缓存数据的新流ByteArrayInputStream bais new ByteArrayInputStream(body);return new ServletInputStream() {Overridepublic int read() {return bais.read();}Overridepublic boolean isFinished() {return bais.available() 0;}Overridepublic boolean isReady() {return true;}Overridepublic void setReadListener(ReadListener readListener) {// 无需实现}};}Overridepublic BufferedReader getReader() throws IOException {return new BufferedReader(new InputStreamReader(this.getInputStream(), this.getCharacterEncoding()));}}然后在 过滤器 处包装请求Slf4jConfigurationpublic class RequestCachingFilterConfig {Beanpublic FilterRegistrationBean requestCachingFilter() {FilterRegistrationBean registrationBean new FilterRegistrationBean();// 核心创建过滤器包装请求为 ContentCachingRequestWrapperregistrationBean.setFilter(new OncePerRequestFilter() {Overrideprotected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)throws ServletException, IOException {// 1. 仅包装 HTTP 请求排除 WebSocket 等if (request instanceof HttpServletRequest !(request instanceof ContentCachingRequestWrapper)) {log.info(进入requestCachingFilter);// 2. 包装请求自动缓存请求体MyRequestWrapper wrappedRequest new MyRequestWrapper(request);filterChain.doFilter(wrappedRequest, response); // 传递包装后的请求} else {filterChain.doFilter(request, response); // 无需包装直接放行}}});// 3. 配置拦截所有请求可根据需求调整 URL 模式registrationBean.addUrlPatterns(/*);registrationBean.setOrder(1); // 优先级最高确保先于其他过滤器执行registrationBean.setName(requestCachingFilter);return registrationBean;}}IO 流只能读取一次是 精心设计的贴合操作系统文件 / 网络 IO 的 顺序消费 特性保持和底层系统的一致性。逝灯秃挥

相关文章:

DotNetPy:现代.NET 与 Python 互操作 实战指南概

我为什么会发出这个疑问呢?是因为我研究Web开发中的一个问题时,HTTP请求体在 Filter(过滤器)处被读取了之后,在 Controller(控制层)就读不到值了,使用 RequestBody 的时候。 无论是字…...

AcousticSense AI算力优化:批处理+FP16混合精度使吞吐量提升3.2倍

AcousticSense AI算力优化:批处理FP16混合精度使吞吐量提升3.2倍 1. 引言:当音乐分析遇上性能瓶颈 想象一下,你正在搭建一个音乐流派的智能分析平台。用户上传一首歌,系统需要快速、准确地告诉你这首歌是摇滚、爵士还是电子乐。…...

GlosSI技术解析:解锁Windows全场景Steam控制器兼容方案

GlosSI技术解析:解锁Windows全场景Steam控制器兼容方案 【免费下载链接】GlosSI Tool for using Steam-Input controller rebinding at a system level alongside a global overlay 项目地址: https://gitcode.com/gh_mirrors/gl/GlosSI GlosSI(G…...

RexUniNLU中文NLU实战:从新闻中一键抽取人名地名机构名

RexUniNLU中文NLU实战:从新闻中一键抽取人名地名机构名 1. 为什么选择RexUniNLU进行信息抽取 1.1 零样本学习的革命性突破 传统的信息抽取系统通常需要大量标注数据来训练模型。以一个典型的人名识别任务为例,你可能需要准备至少5000条标注样本才能达…...

PVE-CT容器部署Ubuntu轻量级桌面环境全攻略

1. PVE-CT容器与Ubuntu轻量桌面环境简介 如果你正在寻找一种在Proxmox VE(PVE)环境下快速部署轻量级Linux桌面的方法,那么使用LXC容器搭配Ubuntu系统绝对是值得考虑的选择。我最近在项目中尝试了这种方案,实测下来不仅资源占用低&…...

Qwen-Image-2512-SDNQ Web服务部署教程:CSDN GPU实例SSH连接与日志实时查看

Qwen-Image-2512-SDNQ Web服务部署教程:CSDN GPU实例SSH连接与日志实时查看 1. 项目概述 Qwen-Image-2512-SDNQ-uint4-svd-r32是一个基于先进AI技术的图片生成服务,通过简单的Web界面就能将文字描述转化为高质量的图像。这个服务特别适合需要快速生成视…...

小白友好:Qwen3-0.6B-FP8部署全流程,Chainlit让交互可视化

小白友好:Qwen3-0.6B-FP8部署全流程,Chainlit让交互可视化 1. 认识Qwen3-0.6B-FP8模型 Qwen3-0.6B-FP8是阿里巴巴通义千问系列中的轻量级语言模型,特别适合在资源有限的设备上快速部署和运行。这个版本采用了FP8(8位浮点数&…...

抖音评论采集工具:3步快速获取完整评论数据的终极指南

抖音评论采集工具:3步快速获取完整评论数据的终极指南 【免费下载链接】TikTokCommentScraper 项目地址: https://gitcode.com/gh_mirrors/ti/TikTokCommentScraper 想要深入分析抖音热门视频的用户反馈?希望了解竞品账号的互动情况?…...

Windows 11安装难题终极解决方案:MediaCreationTool.bat一键绕过硬件限制

Windows 11安装难题终极解决方案:MediaCreationTool.bat一键绕过硬件限制 【免费下载链接】MediaCreationTool.bat Universal MCT wrapper script for all Windows 10/11 versions from 1507 to 21H2! 项目地址: https://gitcode.com/gh_mirrors/me/MediaCreation…...

AIVideo从入门到精通:掌握全流程自动化视频生产的秘诀

AIVideo从入门到精通:掌握全流程自动化视频生产的秘诀 1. 为什么你需要一个AI视频创作平台 想象一下这样的场景:周一早上,老板突然要求你在下午三点前制作一个产品介绍视频。传统流程可能需要你:写脚本→找素材→录音→剪辑→调…...

all-MiniLM-L6-v2技术解析:为何22.7MB模型能在256token长度下保持鲁棒性

all-MiniLM-L6-v2技术解析:为何22.7MB模型能在256token长度下保持鲁棒性 1. 模型架构与设计理念 all-MiniLM-L6-v2是一个令人印象深刻的轻量级句子嵌入模型,它基于BERT架构但进行了精心的优化设计。这个模型的核心目标是在保持高质量语义表示能力的同时…...

FigmaCN:3分钟让Figma界面说中文的终极解决方案

FigmaCN:3分钟让Figma界面说中文的终极解决方案 【免费下载链接】figmaCN 中文 Figma 插件,设计师人工翻译校验 项目地址: https://gitcode.com/gh_mirrors/fi/figmaCN 你是否曾因Figma的全英文界面而困扰?是否在紧张的设计工作中频繁…...

抖音评论采集工具:3分钟获取完整互动数据的智能解决方案

抖音评论采集工具:3分钟获取完整互动数据的智能解决方案 【免费下载链接】TikTokCommentScraper 项目地址: https://gitcode.com/gh_mirrors/ti/TikTokCommentScraper TikTokCommentScraper 是一款专为抖音/ TikTok 设计的评论数据采集工具,通过…...

宝可梦游戏终极随机化器:Universal Pokemon Randomizer ZX完全指南

宝可梦游戏终极随机化器:Universal Pokemon Randomizer ZX完全指南 【免费下载链接】universal-pokemon-randomizer-zx Public repository of source code for the Universal Pokemon Randomizer ZX 项目地址: https://gitcode.com/gh_mirrors/un/universal-pokem…...

告别Cartographer重定位慢:3个优化技巧与子图筛选源码解析

Cartographer重定位性能优化实战:从源码解析到参数调优全指南 在机器人定位与建图领域,Cartographer凭借其出色的SLAM算法表现成为工业界和学术界的宠儿。但当场景切换到重定位场景时,许多开发者都会遇到一个共同的痛点——匹配速度慢得令人抓…...

如何彻底解决Windows驱动残留问题:显卡驱动清理的终极指南

如何彻底解决Windows驱动残留问题:显卡驱动清理的终极指南 【免费下载链接】display-drivers-uninstaller Display Driver Uninstaller (DDU) a driver removal utility / cleaner utility 项目地址: https://gitcode.com/gh_mirrors/di/display-drivers-uninstal…...

从音频到体重秤:聊聊那些‘看不见’的Delta-Sigma ADC在你身边的真实应用

从音频到体重秤:Delta-Sigma ADC如何重塑日常测量的精度边界 当你用蓝牙耳机聆听192kHz高解析音频时,或在智能体脂秤上看到小数点后两位的体重变化时,可能不会想到这些体验背后都藏着一项诞生于1980年代的革命性技术——Delta-Sigma ADC&…...

基于VC++的OBD2蓝牙诊断仪开发实战指南

1. 开发环境搭建与硬件准备 搞OBD2蓝牙诊断仪开发,首先得把家伙事儿备齐。我当年第一次折腾这个的时候,光找兼容的蓝牙模块就花了三天,这里把踩过的坑都给你总结好了。 开发主机建议用Windows 10/11系统,Visual Studio 2019或2022…...

Meixiong Niannian画图引擎MobaXterm集成:远程开发环境配置

Meixiong Niannian画图引擎MobaXterm集成:远程开发环境配置 1. 引言 远程开发已经成为现代开发者的标配,特别是对于需要高性能GPU支持的AI画图应用。Meixiong Niannian画图引擎作为一个强大的AI图像生成工具,通常部署在远程服务器上&#x…...

WeMod Pro功能解锁终极指南:本地增强工具Wand-Enhancer完全解析

WeMod Pro功能解锁终极指南:本地增强工具Wand-Enhancer完全解析 【免费下载链接】Wand-Enhancer Advanced UX and interoperability extension for Wand (WeMod) app 项目地址: https://gitcode.com/gh_mirrors/we/Wand-Enhancer 你是否厌倦了游戏辅助工具We…...

从汽车ECU通信看CAN协议:位填充与错误帧如何保障行车安全与网络稳定

从汽车ECU通信看CAN协议:位填充与错误帧如何保障行车安全与网络稳定 现代汽车电子系统正变得越来越复杂,一辆普通家用轿车可能包含超过100个电子控制单元(ECU),这些ECU通过控制器局域网(CAN)总线…...

如何一键获取Steam游戏清单?5分钟掌握Onekey工具的完整指南

如何一键获取Steam游戏清单?5分钟掌握Onekey工具的完整指南 【免费下载链接】Onekey Onekey Steam Depot Manifest Downloader 项目地址: https://gitcode.com/gh_mirrors/one/Onekey 还在为获取Steam游戏文件清单而烦恼吗?传统方法需要复杂的API…...

MAA明日方舟小助手:如何用开源自动化工具解放你的游戏日常

MAA明日方舟小助手:如何用开源自动化工具解放你的游戏日常 【免费下载链接】MaaAssistantArknights 《明日方舟》小助手,全日常一键长草!| A one-click tool for the daily tasks of Arknights, supporting all clients. 项目地址: https:/…...

Verilator 5.008 + GTKWave 搭建指南:从安装到流水灯实战(附避坑清单)

Verilator 5.008 GTKWave 全流程实战指南:从环境搭建到流水灯仿真 在数字电路设计领域,仿真工具链的搭建往往是初学者面临的第一道门槛。Verilator作为当前最高效的开源Verilog仿真器之一,配合GTKWave波形查看工具,能够构建完整的…...

高效解密网易云音乐NCM格式的专业解决方案

高效解密网易云音乐NCM格式的专业解决方案 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 在数字音乐版权保护的背景下,网易云音乐采用的NCM加密格式为用户带来了跨平台播放的挑战。这种专有格式虽然有效保护了音乐版权&…...

网络安全学习第165天

前言: 就是勒索病毒的防治,因为这是2023年的课程,不知道现在有没有最新的方法,可以解密这个工具,问了ai,说没有解密提高 正题: 没有办法可以解密,因为很难解密,只能做好…...

HY-MT1.5-7B翻译模型效果展示:33种语言互译,实测效果惊艳

HY-MT1.5-7B翻译模型效果展示:33种语言互译,实测效果惊艳 1. 模型核心能力概览 1.1 多语言翻译新标杆 HY-MT1.5-7B是腾讯混元团队推出的新一代翻译大模型,支持33种主流语言之间的高质量互译,并特别优化了5种民族语言及方言变体…...

5分钟掌握跨平台输入法词库转换:告别设备更换的输入烦恼

5分钟掌握跨平台输入法词库转换:告别设备更换的输入烦恼 【免费下载链接】imewlconverter ”深蓝词库转换“ 一款开源免费的输入法词库转换程序 项目地址: https://gitcode.com/gh_mirrors/im/imewlconverter 你是否曾因更换电脑或手机而烦恼输入法词库无法同…...

MetaTube插件:Jellyfin/Emby高性能媒体元数据解决方案深度解析

MetaTube插件:Jellyfin/Emby高性能媒体元数据解决方案深度解析 【免费下载链接】jellyfin-plugin-metatube MetaTube Plugin for Jellyfin/Emby 项目地址: https://gitcode.com/gh_mirrors/je/jellyfin-plugin-metatube MetaTube是一款专为Jellyfin和Emby媒体…...

终极虚拟控制器驱动:如何用ViGEmBus在5分钟内解决游戏兼容难题?

终极虚拟控制器驱动:如何用ViGEmBus在5分钟内解决游戏兼容难题? 【免费下载链接】ViGEmBus Windows kernel-mode driver emulating well-known USB game controllers. 项目地址: https://gitcode.com/gh_mirrors/vi/ViGEmBus 你是否曾因为心爱的游…...