SignalR的简介和传输方式

474 阅读2分钟

一.SignalR简介

SignalR:当所连接的客户端变得可用时服务器代码可以立即向其推送内容,而不是让服务器等待客户端请求新的数据。实现实时服务器与客户端通信。是一个开源.NET 库生成需要实时用户交互或实时数据更新的 web 应用程序。

SignalR的出现,让页面通过javascript可以很简单的调用后端服务的方法,而在后端也可以很简单的直接调用javascript所实现的方法,前后端可以进行实时通信。实现了服务器主动推送(Push)消息到客户端页面,这样客户端就不必重新发送请求或使用轮询技术来获取消息。

注意:SignalR 会自动管理连接。客户端和服务器之间的连接是持久性的,不像传统的 HTTP 连接。

二.SignalR传输方式

SignalR会根据当前浏览器自动选择适当的传输方式。在最坏的情况下,SignalR会选择使用长轮询(Long Polling).

SignalR会依照下列顺序来判定使用那种传输方式:

  • 1.如果浏览器是 Internet Explorer8 或更早版本,则使用长轮询。

  • 2.如果配置了 JSONP(即连接启动时 jsonp 参数设置为 true),则使用长轮询。

  • 3.如果要建立跨域连接(即 SignalR 终结点和宿主页不在相同的域中),并且满足以下条件,则会使用 WebSocket:

    • 3.1客户端支持 CORS(跨域资源共享)
    • 3.2客户端支持 WebSocket
    • 3.3服务器支持 WebSocket
    • 如果这些条件中的任何一条不满足,将使用长轮询.
  • 4.如果未配置 JSONP 并且连接没有跨域,只要客户端和服务器都支持的话,将使用 WebSocket。

  • 5.如果客户端或服务器不支持 WebSocket,则尽量使用服务器发送事件。Forever Frame。

  • 7.如果 Forever Frame 失败,则使用长轮询。

长轮询(long polling)与传统Ajax的不同之处:

  • 1.服务器端会阻塞请求直到有数据传递或超时才返回。
  • 2.客户端 JavaScript 响应处理函数会在处理完服务器返回的信息后,再次发出请求,重新建立连接。
  • 3.当客户端处理接收的数据、重新建立连接时,服务器端可能有新的数据到达;这些信息会被服务器端保存直到客户端重新建立连接,客户端会一次把当前服务器端所有的信息取回。