我开发了一个 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 秒内它会抛出错误,指出“已超出最大上传大小”:
以下是从 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]])))
}
}
这里有一些注意事项:
增加 R Shiny 选项 maxRequestSize (按照 Joe Cheng 的建议):
options(shiny.maxRequestSize=100*(1024*1024))
由于我使用的是 golem,因此这一行被添加到 app.R 文件内,位于 run_app() 函数之前,所有选项都在其中设置。 我一遍又一遍地读到这个命令应该是解决方案,但它根本不起作用。也许我做错了或者什么。
我可以通过在 app_server 函数中添加选项行来增加 golem 设置的最大上传文件大小。
app_server <- function(input, output, session) {
options(shiny.maxRequestSize = 100*1024^2) # Set to 100MB
# Other server code
}