下载文件后Blazor服务器端应用程序死亡

时间:2020-09-18 19:26:38

标签: blazor blazor-server-side

我有一个出色的服务器端应用程序,其中一个页面使用以下代码推送文件下载:

nav.NavigateTo("/download/" + fileName, true);

通过将页面重定向到文件并弹出下载对话框,效果很好。但是,执行此操作后,该应用程序将消失。

错误:由于错误,电路已关闭。

我必须刷新页面以重新建立连接才能继续。

我应该做些不同的事情来允许用户下载文件吗?

2 个答案:

答案 0 :(得分:1)

要记住的事情是,与Blazor合作时,所有通信都是通过websockets进行的。在处理文件下载时可能会出现问题,因为任何离开套接字的导航(例如导航到静态文件)都会断开连接。

一种简单的处理方法是使用BlazorDownloadFile之类的软件包。

要使用它,只需使用以下命令安装nuget:

Enter a string <input id="input">

在Startup.cs文件的ConfigureServices方法中的下一步,添加以下行:

Install-Package BlazorDownloadFile -Version 2.1.2

现在,您可以注入IBlazorDownloadFileService并使用它来下载文件。我在下面提供了一个用法示例,该示例仅是从与执行程序集相同的目录中下载文本文件。

services.AddBlazorDownloadFile();

如您所见,有了它,您可以轻松地允许用户下载文件而不会冒断websocket连接的风险,并且您可以获取有关是否存在问题的反馈,以实现正确的错误处理。

您可能需要注意Github Project中提到的一些注意事项:

关于我在此库中完成的一些性能测试, 那,base64 string和byte []的性能总是比Stream更快。

由于从c#Stream到a之间没有直接转换 JavaScript对象会为此任务增加一些费用。

当它是base64时,这是最简单的数据类型,可以传输和使用

byte []在传输到时会转换为base64字符串 JavaScript,由于某种原因,编码时无法正常工作 导致它的base64表示变成其他 在第二个分区之后被编码为base64字符串。 (如果 任何人都知道如何解决或解决此发出请求的请求)

基于las语句,字节列表从c#传递到 JavaScript作为整数数组,其字节表示形式位于 JavaScript,这就是我发送IList而不是发送IList的原因 byte []在JavaScript内部。

二进制表示似乎表现很好,因为我们只是 需要调用Uint8Array并完全推送二进制表示形式 进入数组,然后将其传递给JavaScript本机Blob 对象。

答案 1 :(得分:0)

您显示的代码应该有效-并且对我有用。该问题似乎是一个困扰许多人的已知(新)问题。您可以在此处找到有关该问题的更多信息:https://github.com/dotnet/aspnetcore/issues/25646

他们说他们正在努力解决此问题,但目前尚无ETA。很抱歉,我没有合适的解决方法可供分享-我仍在探索自己。