【问题标题】:Using ASP .Net SignalR for Long Polling for a single client?使用 ASP .Net SignalR 为单个客户端进行长轮询?
【发布时间】:2013-07-12 13:20:27
【问题描述】:

我有这个问题,我需要先从网络应用程序(在服务器上)压缩(zip)多个文件,然后再将其流式传输到浏览器。我从连接到 SQL 数据库的单独服务中提取文件。因此,在从服务打开文件时会出现巨大延迟,并且在压缩包可以流式传输到浏览器之前压缩文件也会出现延迟。理想情况下,我希望页面上的 DOWNLOAD 按钮调用服务器上的 SignalR 方法,然后在多个文件完成压缩后将通知推送回客户端。这样,浏览器就不会立即请求服务器流式传输压缩文件。只有在多个文件完成压缩后才会开始流式传输。

背景信息:我使用的是 IIS 7.5 和 MVC 4。

我一直在阅读和观看 SignalR 上的视频,但只看到了聊天中心和推送到多个客户端等的示例。是否可以仅将 SignalR 用于发出请求的客户端?如果是这样,我会很感激一些示例代码,或者可能是一个关于如何完成这样的事情的教程的链接。谢谢!

【问题讨论】:

  • 这听起来根本不像长轮询。您想要完成的功能非常非常类似于聊天中心的做法——一个客户端将数据推送到服务器,然后服务器将该数据推送给其他客户端。在您的情况下,一个客户端请求下载,然后服务器在准备好后将有效负载推回同一客户端。非常非常相似的机制,除非您的流程的性质有什么特别之处,否则修改您所看到的代码示例应该相当容易。
  • 长轮询是 SignalR 通信的方式之一,SignalR 的所有功能都可以与任何底层通信方法一起使用,无论是长轮询、Web 套接字还是其他方式。现在在你的情况下它是@RichardNeilIlagan,使用示例聊天应用程序,而不是发送文本,你可以发送文件(字节数组)
  • 出于安全原因,我工作的公司不喜欢使用 AJAX 流式传输文件。 SignalR 是否使用 AJAX 在客户端和服务器之间来回通信?我的想法是简单地使用 SignalR 向客户端“发出信号”(不是双关语),让它知道它现在可以请求下载。然后客户端会请求一个文件,并且下载过程会正常进行(即,服务器将使用正常的 http 过程流式传输文件)。这对 SignalR 可行吗?
  • 是的,您可以根据计时器或另一个客户端调用(来自您的下载页面的 JavaScript)从服务器调用带有文件名参数的函数,然后客户端将请求正常归档。
  • 我实际上是从 Web 服务中提取文件。有什么方法可以从服务器中提取内存中的文件,然后触发客户端发出 httpRequest 以流式传输该文件?或者,文件是否必须保存在服务器的硬盘上?

标签: asp.net-mvc-4 streaming iis-7.5 signalr long-polling


【解决方案1】:

要实现您的需要,您必须定义 3 个客户端

  • 浏览器,它会在请求下载时调用The Hub,然后它会等待来自The Hub的调用来下载文件。
  • 服务器,当浏览器请求下载时,会收到来自 The Hub 的通知,并在一切就绪后调用 The Hub 来传递文件。
  • 服务,从服务器传递过来的The Hub文件,并准备好下载文件,然后发送通知到中心通知浏览器

注意

不建议将大文件存储在内存中,通过 SignalR 传递它也不是很好,除非它是服务器和服务共享文件的唯一方式,所以如果你有一个共同的storage - 磁盘或数据库 - 最好使用它

【讨论】:

    猜你喜欢
    • 2019-03-03
    • 2012-10-16
    • 1970-01-01
    • 2017-03-12
    • 2010-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多