首页 > 其他分享 >小白细节思考之读取Request.Body

小白细节思考之读取Request.Body

时间:2024-08-10 20:50:32浏览次数:12  
标签:Body 读取 stream Request 小白 请求

小白最近做的项目当中涉及到了WebApi,具体是三方程序通过调用小白写的 WebApi 进行推送数据,调用的次数、频率是没有限制的,因此就涉及到了并发。

小白使用.NET 8 创建了WebApi,在读取Request请求时,使用如下的方式:

1 var requestContent = string. Empty;
2 using (var stream = new MemoryStream())
3 using (var reader = new StreamReader(stream))
4 {
5     await Request.Body.CopyToAsync(stream);
6     stream.Seek(0, SeekOrigin.Begin);
7     requestContent = await reader.ReadToEndAsync();
8 }

使用这种方式,在Request的Body数据量很大并且两个请求同时发起时,会导致在Request的Body未读取完毕时,便已经释放从而导致程序报错。

小白一开始的解决方法是设置Request Body的最大数量,然而并没有什么效果。后来小白考虑是不是将接口改为同步的方式,以达到处理完一个请求再处理另一个请求的目的,这样是不是就不会有提前释放的错误了。

然而虽然接口是同步的方式,但是外部请求来的时候服务器还是会同时处理多个请求。这就引发了小白对IIS处理并发请求的思考,事实上IIS 的线程池会分配适当数量的线程来并行处理这些请求,因此不管接口是否同步,都会并行处理。

并且同步的方式性能并不是很好,微软也不建议这么操作,当程序流量比较大的时候,很容易导致程序不稳定甚至崩溃。

经过小白一番努力最后发现,多个接口里面都用到了上述的代码去读取Request.Body。所以首先将这段代码封装未一个方法,以达到优化代码的目的。

关键的解决方法如下:

StreamReader stream = new StreamReader(Request.Body);
string body = stream.ReadToEndAsync().GetAwaiter().GetResult();

不使用MemoryStream,直接使用StreamReader读取,同时将ReadToEndAsync变为同步方法。虽然小白没有真正弄清楚原因,但是上面的方法成功解决了小白程序的bug。

具体的原理,小白希望有热爱编码之士仗义出手指教一下。或者小白在编程领域越来越强之后,再回过头来,对其中原理解释一番。

 

标签:Body,读取,stream,Request,小白,请求
From: https://www.cnblogs.com/pocn/p/18352763

相关文章

  • Java网络编程——Request Response 对象
    Response-网页上一章我们学习了Java中使用Okhttp3库请求网页或调用API的知识。使用一条语句执行调用请求,并取得返回结果字符串:call.execute().body().string()execute()方法是真正执行发送请求,前面的一系列代码是做前置准备。这段代码获得服务器返回内容的......
  • 【编程笔记】解决移动硬盘无法访问文件或目录损坏且无法读取
    解决移动硬盘无法访问文件或目录损坏且无法读取只解决:移动硬盘无法访问文件或目录损坏且无法读取问题由于频繁下载数据,多次安装虚拟机导致磁盘无法被系统识别。磁盘本身是好的,只是不能被识别,如果将磁盘格式化,就可以正常使用,这样磁盘内数据就丢失了。怎样才能即保留数据......
  • 易捷OA协同办公系统 ShowPic接口任意文件读取漏洞复现 [附POC]
    文章目录易捷OA协同办公系统ShowPic接口任意文件读取漏洞复现[附POC]0x01前言0x02漏洞描述0x03影响版本0x04漏洞环境0x05漏洞复现1.访问漏洞环境2.构造POC3.复现易捷OA协同办公系统ShowPic接口任意文件读取漏洞复现[附POC]0x01前言免责......
  • 如何正确配置 Nginx 来防止任意文件读取攻击?
    限制alias指令的使用:使用alias指令时,确保路径不会导致路径遍历漏洞。避免使用用户输入作为alias的一部分。组合使用 root 和 aliasserver{     root/var/www;     location/static{     alias/var/www/public/static;   ......
  • java读取JSON文件并解析
    importcom.fasterxml.jackson.core.type.TypeReference;importcom.fasterxml.jackson.databind.ObjectMapper;importorg.codehaus.jettison.json.JSONObject;importjava.nio.file.Files;importjava.nio.file.Paths;importjava.util.List;importjava.util.Map;......
  • 如何使用 Python 从 Excel 工作表中读取正斜杠
    我有20多列的Excel工作表,如果我想选择不包含文本n/a的行,是否可以将n/a作为文本传递并找到它?我尝试过的代码是,''''将pandas导入为pd进口重新导入操作系统defextract_data(input_file):#读取输入的Excel文件df=pd.read_excel(input_file)#Checkif'......
  • 读取EXCEL数据导入到oracle
    importpandasaspdimportcx_Oraclefromdatetimeimportdatetime#数据库连接信息username='****'#替换为您的用户名password='****'#替换为您的密码dsn='192.168.10.216:1521/ORCL'#替换为您的数据源名称#读取Excel文件excel_file=......
  • Flask request和response
    flask框架中request请求用法详解_flaskrequest-CSDN博客Flask处理响应内容_theviewfunctiondidnotreturnavalidresponse-CSDN博客reques常用的属性:如果是json格式的请求数据,则是采用request.data来获取请求体的字符串。如果是form表单的请求体,那么则可以使用request.......
  • R语言读取和修改 fcs文件
    记住要从上往下一个一个包的安装,已经安装了的就不用安装,如果就是读取和修改fcs文件,只需要安装flowCore包就可以了。if(!requireNamespace("BiocManager",quietly=TRUE))install.packages("BiocManager")##数据源:BiocManager::install("flowWorkspaceData")##数据......
  • 域控安全:读取ntds.dit文件中的hash值
    多种方式离线读取ntds.dit文件中的hash值多种方式在线读取ntds.dit文件中的hash值多种方式离线读取ntds.dit文件中的hash值离线一般需要两步:1、将远端域控的ntds.dit下载到本地,2、然后利用再在本地进行。注意:因为system.hive里存放着ntds.dit的秘钥,所以需要转储......