在持久性连接的基础上,SignalR提供了一个更高层次的抽象层:Hub,基于javascript的灵活性和C#的动态特性,Hub是一个至关重要的开发模式,它消弭了客户端和服务端这两个独立的物理环境之间的界限。

在Web环境中最通用的使用模式允许我们透明地在客户端和服务端之间进行方法调用。这就是双向RPC,即可以直接从客户端调用服务器端的方法,同时服务端也可以调用客户端的方法。

为了实现以上的功能,SignalR将借助服务器Hub类在客户端自动创建代理对象,并在它们的方法中输入它们实际方法的远程调用;相反,当服务器端调用客户端某个方法时它将被一个服务器端打包这些调用的动态类型的特殊协议所解析并使用底层传输协议同构推送到其他断点,然后它们将达到各个客户端,并在客户端进行解释和运行。

现在,在服务端建立Hub类,如:

 using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using Microsoft.AspNet.SignalR; namespace WebApplication2
{
public class TestHub : Hub
{
public void Hello()
{
Clients.All.hello();
}
}
}

与持久性连接不同,基于Hub的服务不需要在启动时映射指定的Hub和和访问的URL,因为系统默会自动查找相关的Hub类,同时它们可以通过一个单独的基URL(/SignalR)进行访问,当然,为了方便这个基URL可以更改:

 using System;
using System.Threading.Tasks;
using Microsoft.Owin;
using Owin;
using Microsoft.AspNet.SignalR;
[assembly: OwinStartup(typeof(WebApplication2.Startup))] namespace WebApplication2
{
public class Startup
{
public void Configuration(IAppBuilder app)
{
app.MapSignalR();//默认映射路径"/SignalR"
//或
app.MapSignalR("/test",new HubConfiguration());//自己设定访问路径,同时设置Hub配置项,无需指定启动的Hub类,因为它们被自动识别
}
}
}

在TestHub类中,

 public class TestHub : Hub
{
public void Hello()
{
Clients.All.sayHi("你好");
}
}

Hello是TestHub类中的一个方法,这个方法可以给客户端用js调用。

在这个方法里面,Clients.All.sayHi()表示向所有的客户端发起调用客户端用js写的sayHi函数。

为了防止暴露TestHub真实的名称,我们可以为它起个别名Test.因为这个别名会在客户端调用的时候用到。

 [HubName("test")]
public class TestHub : Hub
{
    //省略部分代码
  }

除了服务端可以向所有客户端通知调用客户端方法之外,还可以对其中想要发送的客户端进行限制。同时Clients这个属性有很多动态成员供我们使用:

Clients.All:允许“调用”连接到此Hub上的所有客户端的一个方法

Clients.AllExcept:表示该调用必须发送给所有客户端,但是除了那些作为参数的connectionId以外。这里的参数可以是connectionId字符串、数组等

Clients.Caller 确定调用者的接收者是目前调用正在执行Hub方法的客户端

Clients.Client:将对方法的调用发送给指定connectionId的客户端,参数可以是字符串,也可以是数组

Client.Others :代表所有已连接的客户端,但是不包括正在调用该方法的客户端。

在方法中可以通过访问 this.Context.ConnectionId来获得当前掉用方法的客户端唯一标识符

在服务端TestHub类中已经定义好了一个hello的方法,同时该方法的目的就是在所有客户端中调用sayHi方法。

现在开始建立客户端:

新建一个html页面,在代码中写下如下代码:

 <!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<title></title>
<script src="Scripts/jquery-1.10.2.min.js"></script>
<script src="Scripts/jquery.signalR-2.1.2.min.js"></script>
<script >
$(function () {
//不是用代理进行与服务器通信
var connection = $.hubConnection("/test");//根据设置好的映射路径创建连接
var proxy = connection.createHubProxy("test");//根据连接创建我们需要访问的hub代理。test这里是之前创建好的Testhub类
connection.start(function () {
//调用服务端方法
proxy.invoke("hello");//调用TestHub中hello方法
});
//为客户端创建方法,这里的sayHi方法提供服务端调用
proxy.on("sayHi", function (msg) {
alert(msg);
}); });
</script>
<meta charset="utf-8" />
</head>
<body> </body>
</html>

SignalR入门之Hub的更多相关文章

  1. [置顶] MVC中使用signalR入门教程

    一.前言:每次写总要说一点最近的感想 进入工作快半年了,昨天是最郁闷的一天,我怀疑我是不是得了"星期一综合征",每个星期一很没有状态.全身都有点酸痛,这个可能一个星期只有周末才打一 ...

  2. SignalR 入门 .netCore实现聊天室

    SignalR 入门 .netCore实现聊天室 本文根据微软SignalR 简介 | Microsoft Docs 和 ASP.NET Core SignalR 简介 | Microsoft Doc ...

  3. [SignalR]在非Hub继承类中使用脚本方法

    原文:[SignalR]在非Hub继承类中使用脚本方法 新建一个普通类OutHub,里面包含一个脚本方法OutHubTest. 因为大家知道,若能让脚本调用到的话,必须继承Hub,那怎么实现了?通过G ...

  4. SignalR入门之从外部访问持久性连接或Hub

    有的时候,需要从外部访问持久性连接或Hub服务. 比如,假设A和B两个客户端正在聊天,那么系统或第三方在不参与聊天的情况需要为他们发送系统消息,那么此时,就需要独立来访问持久性连接或Hub服务. 之前 ...

  5. ASP.NET SignalR入门

    前言 之前在培训ASP.NET WebAPI的时候有提过SignalR这个技术,但当时只是讲了是用来做什么的,并没有多说.因为自己也是画图找资料的时候见到的.后来当一直关注的前端大神贤心发布LayIM ...

  6. SignalR入门篇

    写在前面的废话 在写关于SignalR的学习笔记之前研究了几天的webSocket,毕竟这才是未来的技术趋势,虽然很早就听说过WebSocket,但是并没有在实际项目中遇到过,所以也就没有深入研究.通 ...

  7. SignalR入门之多平台SignalR服务端

    之前创建SignalR服务端是基于Web应用程序而言的.那么能不能把SignalR服务端做成控制台应用程序.Winform或windows服务呢? 答案是肯定的. 之前尽管看起来好像是IIS和ASP. ...

  8. C# -Asp.Net.SignalR.Core之Hub

    前言 程序员的进步是需要环境的,良好的团队环境,良好的开发环境,会让人进步的更加快速. 所以,我认为,如果一个程序员,在2019年还在用Visual Studio 2005开发,那么,他,大概率,不会 ...

  9. Asp.Net Core SignalR 用泛型Hub优雅的调用前端方法及传参

    继续学习 最近一直在使用Asp.Net Core SignalR(下面成SignalR Core)为小程序提供websocket支持,前端时间也发了一个学习笔记,在使用过程中稍微看了下它的源码,不得不 ...

随机推荐

  1. Python黑帽编程2.8 套接字编程

    Python黑帽编程2.8 套接字编程 套接字编程在本系列教程中地位并不是很突出,但是我们观察网络应用,绝大多数都是基于Socket来做的,哪怕是绝大多数的木马程序也是如此.官方关于socket编程的 ...

  2. Swift 和 C# 的语法比较

    昨天看到Jacob Leverich 写了一篇文章 Swift is a lot like Scala 介绍Swift 和 Scala 的语法对比,从这篇文章的确可以看到Swift 的语法和 Scal ...

  3. Android笔记——eclipse快捷键

    查看快捷键定义的地方 Window->Preferences->General->Keys. 编辑相关快捷键 1. [ALT+/] 自动提示方法 此快捷键为用户编辑的好帮手,能为用户 ...

  4. SQL中Group By的使用

    1.概述 2.原始表 3.简单Group By 4.Group By 和 Order By 5.Group By中Select指定的字段限制 6.Group By All 7.Group By与聚合函 ...

  5. 浅析Yii2的view层设计

    Yii2.0的view层提供了若干重要的功能:assets资源管理,widgets小组件,layouts布局... 下面将通过对Yii2.0代码直接进行分析,看一下上述功能都是如何实现的,当然细枝末节 ...

  6. LINQ系列:LINQ to SQL Join连接

    1. 一对多 var expr = context.Products .Where(p => p.Category.CategoryName == "LINQ to SQL" ...

  7. C#设计模式系列:简单工厂模式(Simple Factory)

    1. 简单工厂模式简介 1.1 定义 简单工厂模式定义一个Factory类,可以根据参数的不同返回不同类的实例,被创建的实例通常有共同的父类. 简单工厂模式只需要一个Factory类. 简单工厂模式又 ...

  8. Select count(*)和Count(1)的区别和执行方式

        在SQL Server中Count(*)或者Count(1)或者Count([列])或许是最常用的聚合函数.很多人其实对这三者之间是区分不清的.本文会阐述这三者的作用,关系以及背后的原理.   ...

  9. ASP.NET Core的配置(3): 将配置绑定为对象[上篇]

    出于编程上的便利,我们通常不会直接利用ConfigurationBuilder创建的Configuration对象读取某个单一配置项的值,而是倾向于将一组相关的配置绑定为一个对象,我们将后者称为Opt ...

  10. Jquery通过Ajax方式来提交Form表单

    今天刚好看到Jquery的ajax提交数据到服务器的方法,原文是: 保存数据到服务器,成功时显示信息. jQuery 代码: $.ajax({ type: "POST", url: ...