You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

通过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))

但该设置未生效。

问题咨询

  1. 该命令是否有误?放置位置是否正确?应置于UI还是server部分?
  2. shinyapps.io控制台是否有其他可修改上传限制的位置?是否受Starter Plan订阅限制?
  3. 是否可通过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的分片依次传输是可行的,具体实现思路:

  1. C#端将大JSON数据分割为多个小分片(建议控制在45MB以内,预留冗余空间),每个分片添加标识(如分片序号、总片数、数据唯一ID);
  2. R Shiny端维护临时存储(内存列表、临时文件或数据库均可),接收每个分片后进行拼接,待所有分片接收完成后再执行后续分析;
  3. 需处理分片丢失、重复传输的情况,确保数据完整性。

内容的提问来源于stack exchange,提问作者Raul Coroban

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 19:31:03