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



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

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

通过将页面重定向到文件并弹出下载对话框,可以很好地工作。然而,在这个动作之后,应用程序就死了。

错误:电路因错误而关闭。

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

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

适用于任何使用。NET 5 RC2

如果您正在使用。NET 5 RC2或更高版本,则此解决方案将不适用于您,上面问题中显示的代码应能解决此问题。如果你仍然有问题,很可能你还有其他问题。

适用于使用之前版本的任何人。NET 5 RC2

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

处理这个问题的一个简单方法是使用BlazorDownloadFile这样的包。

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

Install-Package BlazorDownloadFile -Version 2.1.2

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

services.AddBlazorDownloadFile();

现在,您可以注入IBlazorDownloadFileService并使用它下载文件。我在下面包含了一个这样的用法示例,它只是从与执行程序集相同的目录下载一个文本文件。

@page "/"
@using BlazorDownloadFile
@using System.IO
@using System.Reflection
@using System.Threading
<h1>Hello, world!</h1>
Welcome to your new app.
@Message
<br/>
<SurveyPrompt Title="How is Blazor working for you?"/>
<button @onclick="OnClicked">Download File</button>
@code{
[Inject] IBlazorDownloadFileService BlazorDownloadFileService { get; set; }
public string Message = String.Empty;

public async Task OnClicked()
{
var path = Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), "TestDownloadFile.txt");
var bytes = File.ReadAllBytes(path);
var task = await BlazorDownloadFileService.DownloadFile("testdownload.txt", bytes.ToList(),CancellationToken.None,"application/octet-stream");
if (task.Succeeded)
{
Message = "Successful download!";
}
else
{
Message = task.ErrorMessage;
}
}
}

正如你所看到的,有了它,你可以很容易地允许用户下载文件,而不会有破坏websocket连接的风险,并且你可以获得关于是否存在问题的反馈,以便实现正确的错误处理。

Github项目中提到了一些你可能需要注意的注意事项:

关于我在这个库中所做的一些性能测试也就是说,base64字符串和byte[]的执行速度总是比Stream快。

由于从c#流到JavaScript对象在这个任务中稍微贵一点。

当它的base64时,这是传输和工作最简单的数据类型

byte[]在传输到时转换为base64字符串JavaScript,由于某种原因,它在编码时无法正常工作导致其base64表示在执行在第二个分区之后,当被编码为base64字符串时。(如果任何人都知道如何修复或解决这个问题(提出拉取请求(

根据las语句,一个字节列表从c#传递到JavaScript作为一个具有字节表示形式的整数数组JavaScript,这就是为什么我发送IList而不是byte[]内部到JavaScript。

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

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

他们说他们正在努力解决这个问题,但目前还没有预计到达时间。很抱歉,我没有一个合适的解决方法可以分享——我自己仍在探索。

最新更新