通过WebView2向R Shiny传数据时触发上传大小超限错误
问题描述
我开发了一款嵌入R Shiny应用的C# Windows应用,该R Shiny部署在shinyapps.io上且运行正常。通过WebView2以POST请求向R Shiny传输待分析的数据,数据量小于50MB时表现正常。但当传输数据超过50MB(二进制52428800字节)时,iframe加载R Shiny界面后10-15秒会抛出“Maximum upload size reached”错误。
相关代码
C#发送端代码
await DataView.EnsureCoreWebView2Async(); var postData = Encoding.UTF8.GetBytes(jsonData); var postDataStream = new MemoryStream(postData.Length); postDataStream.Write(postData, 0, postData.Length); postDataStream.Seek(0, SeekOrigin.Begin); var request = DataView.CoreWebView2.Environment.CreateWebResourceRequest(DataView.Source.AbsoluteUri, "POST", postDataStream, "Content-Type: application/json"); DataView.CoreWebView2.NavigateWithWebResourceRequest(request);
R Shiny接收端代码(置于UI部分)
app_ui <- function(request) { if (identical(request$REQUEST_METHOD, "POST")) { # Log the reception log_safe_info("POST request received") query_params <- parseQueryString(request$QUERY_STRING) # Read from 'request' body_bytes <- request$rook.input$read(-1) result <- jsonlite::fromJSON(rawToChar(body_bytes)) log_safe_info(paste0("Size of the received object: ", object.size(result[[2]]))) } }
备注
- 日志显示已执行到该段代码;
- result为含两个元素的数组,所需数据在第二个元素,第一个为时间戳;
- 无JSON读取等其他错误。
已尝试无效方案
按照Joe Cheng的建议,在golem框架的app.R中run_app()前设置:
options(shiny.maxRequestSize=100*(1024*1024))
但该设置未生效。
问题咨询
- 该命令是否有误?放置位置是否正确?应置于UI还是server部分?
- shinyapps.io控制台是否有其他可修改上传限制的位置?是否受Starter Plan订阅限制?
- 是否可通过WebView2发送多段POST请求?将数据拆分为小于50MB的分片依次传输是否可行?
解决方案
针对问题1
options(shiny.maxRequestSize=100*(1024*1024)) 命令本身无错误,但在golem框架下仅在run_app()前设置可能不生效。正确做法是将该设置放在app.R的最顶部(甚至在加载golem包之前),或者通过run_app的参数传递:
options(shiny.maxRequestSize = 100*1024*1024) golem::run_app()
也可在server函数启动前设置,或写入项目的global.R文件(如果存在)。该设置属于全局选项,和UI/server部分无直接绑定,但必须在Shiny应用初始化前加载才能生效。
针对问题2
shinyapps.io的上传限制受订阅计划直接约束:
- Starter Plan默认最大上传大小为50MB,这是平台层面的硬限制,无法通过应用内的
shiny.maxRequestSize突破; - 若需要更大上传容量,需升级至Basic或Professional等更高等级订阅,这类计划支持最高1GB的请求大小;
- shinyapps.io控制台无额外设置入口修改上传限制,所有限制由订阅计划决定。
针对问题3
可以通过WebView2发送多段POST请求,将数据拆分为小于50MB的分片依次传输是可行的,具体实现思路:
- C#端将大JSON数据分割为多个小分片(建议控制在45MB以内,预留冗余空间),每个分片添加标识(如分片序号、总片数、数据唯一ID);
- R Shiny端维护临时存储(内存列表、临时文件或数据库均可),接收每个分片后进行拼接,待所有分片接收完成后再执行后续分析;
- 需处理分片丢失、重复传输的情况,确保数据完整性。
内容的提问来源于stack exchange,提问作者Raul Coroban
相关产品推荐
相关产品推荐

