使用WebView2发送数据到R Shiny时“达到最大上传大小”

问题描述 投票:0回答:1

我开发了一个 C# Windows 应用程序,它通过 iframe 嵌入了 R Shiny 应用程序。这个 R Shiny 应用程序已部署在 shinyapps.io 上并且运行良好。 R Shiny 应用程序需要分析来自 C# Windows 应用程序的数据,这可以通过使用 WebView2 的 POST 请求来接收,这就像奇迹一样。

问题

当发送的文件大小超过 50MB(二进制为 52428800 字节)时,就会出现问题。虽然发送数据的大小(在 C# Windows 应用程序端测量)保持在 50Mb 以下,但它工作得很好。 但超出该大小后,尽管包含 R Shiny 应用程序的 iframe 启动并加载界面,但在 10-15 秒内它会抛出错误,指出“已超出最大上传大小”:

Upload size exceeded - Error as shown in the UI

以下是从 Windows 应用程序发送它的代码:

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 端接收它的代码。此代码放置在 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]])))
  }
}

这里有一些注意事项:

  1. 日志记录已到达这部分代码。
  2. R Shiny 应用程序内的代码从 result 对象读取数据,该对象是一个包含 2 个位置的数组。我需要的数据位于第二个位置,而第一个位置仅包含时间戳。对象内部不包含其他数据。
  3. 没有其他错误,例如与读取 JSON 文件等相关的错误。

我尝试过什么但没有成功

增加 R Shiny 选项 maxRequestSize (按照 Joe Cheng 的建议):

options(shiny.maxRequestSize=100*(1024*1024))

由于我使用的是 golem,因此这一行被添加到 app.R 文件内,位于 run_app() 函数之前,所有选项都在其中设置。 我一遍又一遍地读到这个命令应该是解决方案,但它根本不起作用。也许我做错了或者什么。

我有问题

  1. 命令是否错误?也许命令的位置是错误的?它应该位于应用程序的 UI 部分吗?或者也许是服务器?
  2. Shinyapps 仪表板中是否有其他地方可以更改此限制?它是否受我在 ShinyApps(入门计划)上订阅的限制?
  3. 有没有办法通过WebView2发送多个POST请求?我的[绝望]想法是将数据分成块<50Mb each and send them sequentially. Maybe by doing that the upload size is not hit.
r rest shiny webview2
1个回答
0
投票

我可以通过在 app_server 函数中添加选项行来增加 golem 设置的最大上传文件大小。

app_server <- function(input, output, session) {
  options(shiny.maxRequestSize = 100*1024^2)  # Set to 100MB
  # Other server code
}
© www.soinside.com 2019 - 2024. All rights reserved.