SignalR 是一个库,它允许服务器端代码推送内容到客户端,而无需客户端请求。这意味着可以在服务器端数据准备好后,实时地将数据广播给所有连接的客户端。SignalR 通过生成 JavaScript 代码来实现这一点,当在客户端渲染时,不需要担心代理 JavaScript,因为 SignalR 会处理所有这些工作。只需要从服务器端调用 JavaScript 函数即可。
要在项目中添加 SignalR,需要去 Nuget 包管理器搜索 SignalR,会看到 MicrosoftASP.NETSignalR 在列表的顶部,点击安装即可。它会添加所有运行所需的引用。如果项目中没有 Scripts 文件夹,它会添加一个 Scripts 文件夹并导入 jquery 和 jquery-signalR 库。
在这个阶段,已经拥有了所有必需的引用和脚本。现在,是时候添加 SignalR 启动类,这样就可以告诉 OWIN 如何配置它。Startup 类如下所示:
using Microsoft.Owin;
using Owin;
[assembly: OwinStartupAttribute(
typeof(DeepASP.SignalRMVC.SignalRStartup))]
namespace DeepASP.SignalRMVC
{
public partial class SignalRStartup
{
public void Configuration(IAppBuilder app)
{
app.MapSignalR();
}
}
}
将这个启动类添加到了 App_Start 文件夹中,因为 MVC 已经创建了这个文件夹,并且里面已经有了启动类。但可以将它放在任何想要放的地方。现在,添加 SignalR Hub 类。如果右键添加新项,它应该在 signalR 模板下,如果没有,不用担心,只需添加一个新类并继承自抽象类:
namespace DeepASP.SignalRMVC
{
using Microsoft.AspNet.SignalR;
using Microsoft.AspNet.SignalR.Hubs;
[HubName("Broadcaster")]
public class SignalRHub : Hub { }
}
逻辑上,这就是需要的所有 SignalR 内容。现在想访问 Hub,这样就可以从服务器端调用 JavaScript 函数,对吗?是的。好的,让添加另一个类 Broadcast.cs 如下:
namespace DeepASP.SignalRMVC
{
using Microsoft.AspNet.SignalR;
using System;
public class Broadcast
{
private static Lazy context = new Lazy(() =>
GlobalHost.ConnectionManager.GetHubContext());
private static IHubContext Broadcaster
{
get
{
return context.Value;
}
}
public static bool SendDataToAllConnectedClients(string data)
{
Broadcaster.Clients.All.JavaScriptFunction(data);
return true;
}
}
}
SendDataToAllConnectedClients 方法调用 JavaScript 函数 “JavaScriptFunction”,传递一个 string 参数。可以以 JSON 格式传递任意多的复杂对象。只是为了清晰起见,将 JavaScript 端的函数命名为 JavaScriptFunction,但会给它一个有意义和目的性的名字。现在,将编写这个 JavaScript 函数。对于这篇文章,创建了另一个名为 BroadcastController.cs 的控制器及其视图。现在,因为这个视图将负责广播从服务器发送的消息,将在这个视图中添加所需的 .js 库:
<script src="~/Scripts/jquery-2.1.4.js"></script>
<script src="~/Scripts/jquery.signalR-2.2.0.js"></script>
<script src="~/signalr/hubs"></script>
<script>
var broadcaster = $.connection.Broadcaster;
broadcaster.client.JavaScriptFunction = function(d) {
document.getElementById("data").innerHTML = d;
}
$.connection.hub.start();
</script>
JavaScript 库的顺序很重要。现在这就是从服务器端调用的 JavaScript 函数 “JavaScriptFunction” 的订阅。对于这个演示,只是从服务器端发送了一个字符串 HTML,但当订阅时,可以在这里编写逻辑。
是的,这就是SignalR的全部内容。如果对下载这个演示感兴趣,请点击这里。
在进入生产环境之前,这里有一些重要的事情需要记住: