【发布时间】: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 有关。
【问题讨论】: