服务端主动推送,其实我们一直这么用,比如:当我们从客户端调用服务端方法时,绝大部分服务端也会有相应的响应一个客户端方法。

而把它作为独立一部分来讲,是因为我想通过一个示例,来表现服务端主动推送的能力。对于大访问量而言批量推送也不能按常规的做法,关于这一点,我想会再发表新的文章来说明。

现在我制作一下监控服务器CPU状态的示例,这里我会采用 PersistentConnection 来创建一个消息通道。SignalR分别支持 PersistentConnectionHub API接口两种,他们两者有者很大的不同,同样也会在其他文章说明。

一、CPU状态模型类

Usage 占用率、Time当时间。

public class CPUUsageInfo
{
    public double Usage { get; set; }
    public DateTime Time { get; set; }
}

二、创建一个继承于 PersistentConnection 消息连接通道

public class PerfmonConnection : PersistentConnection
{
}

三、注册连接通道

目前2X版本,必须使用 app.MapSignalR 来注册连接通道,他提供一个可以指定连接对象的泛型入口,参数分别是连接时用的服务器地址 /perfmon,以及我们需要一些属性配置。

app.MapSignalR<PerfmonConnection>("/perfmon", new ConnectionConfiguration()
{
    EnableJSONP = false
});

四、读取服务器CPU使用率

这里我是在 Application_Start 上做一个 Task 任务。其中我们可以 GlobalHost.ConnectionManager 来获取我们创建的连接消息实例对象,紧接者再通过 Broadcast 进行通知。完整代码如下:

Task.Factory.StartNew(() =>
{
    IConnection connection = GlobalHost.ConnectionManager.GetConnectionContext<PerfmonConnection>().Connection;

    var counter = new PerformanceCounter();
    counter.CategoryName = "Processor";
    counter.CounterName = "% Processor Time";
    counter.InstanceName = "_Total";

    while (true)
    {
        var item = new CPUUsageInfo()
        {
            Time = DateTime.Now,
            Usage = Math.Round(counter.NextValue(),