一步一步学习SignalR进行实时通信_4_Hub

本文详细介绍了SignalR中的Hub概念及其与持久连接的区别,并通过代码示例展示了如何创建Hub服务、配置和使用Hub进行实时通信。文章还包括了Hub与持久连接在映射、默认服务路径和跨域等方面的对比,以及代码解析和效果展示,帮助开发者更好地理解和应用SignalR技术。

一步一步学习SignalR进行实时通信_4_Hub

标签(空格分隔): SignalR


前言

之前我们介绍了SignalR有2级抽象,前2篇文章我们讲的是较底层PersistentConnection,从这篇文章开始我们学习下较高一层的Hub。

创建Hub

创建Hub的方法和创建PersistentConnection非常类似

public class EchoHub:Hub
{
    //这是Hub
}
public class EchoPersistentConnection:PersistentConnection
{
    //这是PersistentConnection
}

配置Hub

学过了PersistentConnection,那么Hub更加不是难事

public void Configuration(IAppBuilder app)
{ 
    // 映射 persistent connections 到/myconnection
    app.MapSignalR<MyPersistentConnection>("/myconnection");
    // 映射 hubs 默认为"/signalr"
    app.MapSignalR();
    //映射Hubs到"/realtime",同时还可以配置HubConfiguration,比如我们uxyao跨域,和上一讲用法是一致
    app.MapSignalR("/realtime", new HubConfiguration());
}

创建Hubs服务

接下来我们进入正题,如何来创建基于Hub的实时通信服务,这里与PersistentConnection有一点差别,前面我们在服务器通过OnReceived()来接受客户端的服务并进行处理,在Hub中我们可以实现我们自己需要的方法来进行处理信息。

  1. 新建一个Hub类取名为MyFirstHub
    11050266.jpg
  2. 默认会生成这样的代码,有一个默认的方法,应该能看得出来这个Hello()方法的功能是发送给有客户端信息,说的更直白一点是所有连接了此Hub的客户端即为Clients,服务器会发送请求调用客户端的hello()方法,类似于PersistentConnection的广播Broadcast()
    76836682.jpg
  3. 创建一个客户端连接
  • 我创建一个html页面名为Hub,引入jquery和signalr的js
  • 在页面载入的时候连接Hub服务,并调用Hello,向所有客户端打招呼

详细代码

  • startup映射
using Microsoft.Owin;
using Owin;
[assembly: OwinStartup(typeof(SignalR_3_Hubs.Startup))]
namespace SignalR_3_Hubs
{
    public class Startup
    {
        public void Configuration(IAppBuilder app)
        {
            app.MapSignalR();
        }
    }
}
  • MyFirstHub
using Microsoft.AspNet.SignalR;
namespace SignalR_3_Hubs.Models
{
    public class MyFirstHub : Hub
    {
        public void Hello(string name)
        {
            Clients.All.hello(name);
        }
    }
}
  • hub.html
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <title></title>
</head>
<body>
<ul id="chat"></ul>
<button id ="sayHello">发送</button>
    <script src="Scripts/jquery-1.10.2.min.js"></script>
    <script src="Scripts/jquery.signalR-2.0.0.min.js"></script>
    <script src="/signalr/js"></script>
    <script type="text/javascript">
        $(function () {
            //创建一个hub服务
            var hub = $.connection.myFirstHub;
            $.connection.hub.start()
                .done(function () {
                    alert("连接成功!");
                })
                .fail(function () {
                    alert("连接失败!");
                });
            hub.client.hello = function (name) {
                $('#chat').append('<li><strong>' + name + '</strong>:Hi!</li>');
            }
            $("#sayHello").click(function () {
                console.log(1);
                hub.server.hello("Jack");
                console.log(2);
            });
        });
    </script>
</body>
</html>

代码解析

这3端代码非常简短也很简单,但是有一点特别要注意的是,我们用PersistentConnetcion在startup中配置SignalR映射时

startup中映射的代码为app.MapSignalR("/echo");

在html客户端js代码中我们是这样写的
var connection = $.connection("/echo");

若通过跨域其他客户端连接则为var connection = $.connection("127.0.0.1:8083/echo");(假设signalR部署在127.0.0.1:8083端口)

这在前面2章我都讲到过,Hub与PersistentConnection有所不同,Hub的默认服务是映射在__/signalr/js/signalr/hubs__

因此如果我们默认hub映射代码为app.MapSignalR();
那么我们需要在html引入<script src="/signalr/js"></script>或者<script src="/signalr/hubs"></script>,否则服务将无法开启
52325393.jpg
我改为<script src="/signalr/></script>那么就报了404错误并提示你是否引用正确。
如果我将映射改为app.MapSignalR("/realtime");
那么引入的代码就应该是<script src="/realtime/signalr/js"></script>或者<script src="/realtime/signalr/hubs"></script>

这下应该明白了吧,前面的映射代表的是映射的根目录。同时你不用奇怪这个路径,这只是个虚拟路径,服务开启后生成的代理(在后面我会讲到代理和非代理的使用),可以看到下载下来的脚本资源文件
66669213.jpg
到此Hub的整个过程应该有些了解了

效果展示

  1. 进入页面
    95264042.jpg
  2. 点击按钮触发
    36005172.jpg

结束语

这里简单的介绍了下Hub,并通过与PersisentConnection进行了比较。下一节将具体的介绍Hub。

源码下载
本文发布至作业部落

参考文献

SignalR Programming in Microsoft ASP.NET pdf 下载

转载于:https://www.cnblogs.com/Jack-Blog/p/4765244.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值