如何从 ASP.NET SignalR 客户端中的 ChannelReader 读取

How to read from ChannelReader in ASP.NET SignalR client

我有一个基于 ASP.NET SignalR(非核心)的现有项目。我需要在不使用大量内存的情况下将大文件流式传输到客户端。我找到了许多使用 aspnetcore 执行此操作的示例,但不是遗留的 asp.net.

我的服务器端实现很简单,就像一个 aspnetcore 示例。

public ChannelReader<byte[]> Download()
{
    var path = "path/to/file.big";
    var channel = Channel.CreateUnbounded<byte[]>();
    _ = WriteToChannel(channel, path);
    return channel.Reader;
    async Task WriteToChannel(ChannelWriter<byte[]> writer, string path)
    {
        using (FileStream fs = File.OpenRead(path))
        {
            var buffer = new byte[8 * 1024];
            while (await fs.ReadAsync(buffer, 0, buffer.Length) > 0)
            {
                await writer.WriteAsync(buffer);
            }
            writer.Complete();
        }
    }
}

但是在客户端,示例要我使用:

_connection.StreamAsChannelAsync<byte[]>("Download");

这在旧版 asp.net 中不可用。我尝试使用:

IHubProxy.Invoke<ChannelReader<byte[]>>("Download");

但是客户端代码只是阻塞,我不知道发生了什么。

有谁知道如何在 asp.net signalr 中使用此技术?或者你能推荐任何其他技术吗?

我试图避免跳出并使用传统的网络 api 和 http 客户端,因为带有身份验证的信号器基础结构已经到位。我觉得信号器方法应该很简单,我只是找不到任何旧的例子。一切以aspnetcore为中心。

流式传输是在 SignalR CORE 中引入的,在 SignalR ASP.NET 中不可用。

对于 SignalR ASP.Net,您需要向文件提供 link 或执行一些操作,例如在集线器中将文件编码为 base64 字符串并在客户端对其进行解码。