【问题标题】:How to read from ChannelReader in ASP.NET SignalR client如何从 ASP.NET SignalR 客户端中的 ChannelReader 读取
【发布时间】:2022-01-26 22:00:19
【问题描述】:

我有一个基于 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 中工作?或者您能推荐任何其他技术吗?

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

【问题讨论】:

    标签: asp.net signalr streaming


    【解决方案1】:

    流是由 SignalR CORE 引入的,不适用于 SignalR ASP.NET。

    对于 SignalR ASP.Net,您需要提供指向文件的链接,或者在集线器中将文件编码为 base64 字符串并在客户端对其进行解码。

    【讨论】:

      猜你喜欢
      • 2012-10-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-01
      • 2015-01-31
      • 1970-01-01
      相关资源
      最近更新 更多