SignalR的简单实现

1创建mvc的空项目

2添加文件夹Counters放在里面的类用于封装性能计数器

3创建PerfCounterWrapper类用于封装性能计数器的实体

using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Web;

namespace SignalR.Counters
{
    public class PerfCounterWrapper
    {
        public PerfCounterWrapper(string name, string category, string counter, string instance = "")
        {
            _counter = new PerformanceCounter(category, counter, instance, readOnly: true);
            this.Name = name;
        }
        public string Name { get; set; }

        PerformanceCounter _counter;

        public float Value
        {
            get
            {
                return _counter.NextValue();
            }
        }
    }
}

注:通过nuget导入Diagnostics类库

4封装性能计数器的业务逻辑

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

namespace SignalR.Counters
{
    public class PerfCounterService
    {
        List<PerfCounterWrapper> _counters;

        public PerfCounterService()
        {
            this._counters = new List<PerfCounterWrapper>();
            _counters.Add(new PerfCounterWrapper("Processor", "Processor", "% Processor Time", "_Total"));
            _counters.Add(new PerfCounterWrapper("Paging", "Memory", "Pages/sec"));
            _counters.Add(new PerfCounterWrapper("Disk", "PhysicalDisk", "% Disk Time", "_Total"));
        }

        public dynamic GetResults()
        {
            return _counters.Select(c => new { name = c.Name, value = c.Value }
            );
        }

    }
}

5创建我们的工作目录-hubs并添加一个hub

using Microsoft.AspNet.SignalR;
using Microsoft.AspNet.SignalR.Hubs;
using SignalR.Counters;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using System.Web;

namespace SignalR.Hubs
{
    //指定该hub的名字,用于在前台中创建使用
    [HubName("PerfHub")]
    public class PerfHub : Hub
    {
        public PerfHub()
        {
            StartCounterCollection();
        }

        private void StartCounterCollection()
        {
            Task.Factory.StartNew(async () =>
            {
                var perfService = new PerfCounterService();
                while (true)
                {
                    var results = perfService.GetResults();
                    Clients.All.newCounters(results);
                    await Task.Delay(2000);
                }
            }, TaskCreationOptions.LongRunning);
        }
        //发送信息
        public void Send(string name, string message)
        {
            Clients.All.addSomeMessage(name, message);
        }
    }
}

页面的内容

@model dynamic
@{
    ViewBag.Title = "Index";
}

<h2>Index</h2>

<div class="container">
    <input type="text" id="message" />
    <input type="button" id="sendmessage" value="Send" />
    <input type="hidden" id="displayname" />
    <ul id="discussion">
    </ul>
</div>

<script src="~/Scripts/jquery-1.6.4.js"></script>

<script src="~/Scripts/jquery.signalR-2.2.0.min.js"></script>
<script type="text/javascript" src="~/signalr/hubs"></script>

<script>
    $(function () {

        //  链接hub
        var chat = $.connection.PerfHub;
        $.connection.hub.logging = true;

        $.connection.hub.start();
        // 执行返回数据 perfhub中的Send中调用的方法签名一致
        chat.client.addSomeMessage = function (name, message) {
            // 将发送的内容显示在页面
            $(‘#discussion‘).append(‘<li><strong>‘ + htmlEncode(name)
                + ‘</strong>: ‘ + htmlEncode(message) + ‘</li>‘);
        };
        // 弹出输入名字的文本框
        $(‘#displayname‘).val(prompt(‘Enter your name:‘, ‘‘));
        // Set initial focus to message input box.
        $(‘#message‘).focus();
        //启动hub的工作

        $.connection.hub.start().done(function () {

            $(‘#sendmessage‘).click(function () {
                // 发送信息
                chat.server.send($(‘#displayname‘).val(), $(‘#message‘).val());
                //清空输入的内容
                $(‘#message‘).val(‘‘).focus();
            });
        });
    });

    function writeEvent(eventLog, logClass) {
        var now = new Date();
        var nowStr = now.getHours() + ‘:‘ + now.getMinutes() + ‘:‘ + now.getSeconds();
        $(‘#discussion‘).prepend(‘<li class="‘ + logClass + ‘"><b>‘ + nowStr + ‘</b> ‘ + eventLog + ‘.</li>‘);
    }
    // This optional function html-encodes messages for display in the page.
    function htmlEncode(value) {
        var encodedValue = $(‘<div />‘).text(value).html();
        return encodedValue;
    }
</script>
时间: 2024-11-02 17:08:35

SignalR的简单实现的相关文章

SignalR的简单使用()

之前提到SignalR代理在网页,通过生成的Js来完成相关的功能.但我不禁想一个问题, 难到SignalR的服务端就能寄存在web端吗,通过访问网页能方式才能启动服务,还有客户端 也只能在web端吗?经过看官网的教程得到 了结论,两者的答案都是否定的. 关于上一篇的hub名第一个为小写的问题,还有调用客户端和服务端方式的问题,后面的教程 提到,这些名字都是用驼峰命名法的,即使定义时收字母是大写,调用时首字母小写也能调到. 1.客户端 SignalR的客户端可是DOTNET下所有的客户端,包括wi

SignalR + MVC5 简单示例

本文和前一篇文章很类似,只不过是把 SignalR 应用在了 MVC 中 新建项目,选择 MVC 模板 安装 SignalR Install-Package Microsoft.AspNet.SignalR 在项目中添加文件夹 Hubs 在 Hubs 文件夹中添加 SignalR Hub Class (V2) 代码如下 using System; using System.Collections.Generic; using System.Linq; using System.Web; usin

ASP.NET SignalR入门

前言 之前在培训ASP.NET WebAPI的时候有提过SignalR这个技术,但当时只是讲了是用来做什么的,并没有多说.因为自己也是画图找资料的时候见到的.后来当一直关注的前端大神贤心发布LayIM2.0之后,于是对Web聊天产生了兴趣.那么在.NET平台下的Web聊天有哪些呢?查找资料发现了ASP.NET SignalR.于是乎...So...Just do it! 简介 按照惯例,先介绍一下什么是SignalR.简单的说,ASP .NET SignalR 是一个ASP .NET 下的类库,

SignalR初体验

简介 ASP .NET SignalR[1]  是一个ASP .NET 下的类库,可以在ASP .NET 的Web项目中实现实时通信.什么是实时通信的Web呢?就是让客户端(Web页面)和服务器端可以互相通知消息及调用方法,当然这是实时操作的. 1.环境部署 首先新建一个mvc项目,通过Nuget获取相应SignalR包.使用Nuget的命令模式,直接输入 Install-Package Microsoft.AspNet.SignalR -Version 1.0.1 由于最新版本需要Net Fr

SignalR循序渐进(一)

前阵子把玩了一下SignalR,起初以为只是个real-time的web通讯组件.研究了几天后发现,这玩意简直屌炸天,它完全就是个.net的双向异步通讯框架,用它能做很多不可思议的东西.它基于Owin,可以脱离繁重的System.Web,随意寄宿在IIS,WindowsService,或者一个控制台程序,这样它即能用于b/s的Web应用,也能用在客户端程序或者服务之间的通讯上.对它的介绍网上早已铺天盖地,这而就不再啰嗦了,先来个小例子,一个聊天室程序. 服务端 新建一个叫SignalRDemo的

Asp.NET MVC 使用 SignalR 实现推送功能二(Hubs 在线聊天室 获取保存用户信息)

简单介绍 关于SignalR的简单实用 请参考 Asp.NET MVC 使用 SignalR 实现推送功能一(Hubs 在线聊天室) 在上一篇中,我们只是介绍了简单的消息推送,今天我们来修改一下,实现保存消息,历史消息和用户在线 由于,我这是在一个项目([无私分享:从入门到精通ASP.NET MVC]从0开始,一起搭框架.做项目 目录索引)的基础上做的,所以使用到的一些借口和数据表,不详细解析,只是介绍一下思路和实现方式,供大家参考 用户登录注册信息 当用户登录之后,我们注册一下用户的信息,我们

SignalR中的依赖注入

什么是依赖注入? 如果你已经熟悉依赖注入可以跳过此节. 依赖注入 (DI) 模式下,对象并不为自身的依赖负责. 下边的例子是一个主动 DI. 假设你有个对象需要消息日志.你可能定义了一个日志接口: C# interface ILogger { void LogMessage(string message); } 在你的对象中,你可以创建一个 ILogger来记录消息. C# // 不用依赖注入. class SomeComponent { ILogger _logger = new FileLo

ASP.NET 即时通讯之SignalR

最近比较累,也没时间写博客,今天索性来一篇,很多时候,网站即时通讯,推送必不可少.但是这部分大家都觉得是那么陌生,不敢尝试,今天我就给大家讲讲SignalR的简单使用. 首先我们打开VS,创建一个web应用程序.然后Nuget安装SignalR,如下. 安装好之后,我们在项目的引用中发现程序给我们自动引用了相关的dll以及js文件. 接着我们创建两个类,一个是ChatHub,继承自Hub,如下 using Microsoft.AspNet.SignalR; using Microsoft.Asp

Asp.Net Core使用SignalR进行服务间调用

原文:Asp.Net Core使用SignalR进行服务间调用 网上查询过很多关于ASP.NET core使用SignalR的简单例子,但是大部分都是简易聊天功能,今天心血来潮就搞了个使用SignalR进行服务间调用的简单DEMO. 至于SignalR是什么我就不多说了,微软官方文档也不少. 第一步新建项目 所有VS开发第一步都是新建一个解决方案哈,这里我就不多介绍如何新建项目啦~~ 开发环境,VS2017,.NET CORE 2.1 新建两个asp.net core项目 如此简单的操作大家都懂