SignalR框架深入

来看看我们创建的MyHub类的父类Hub类,它是一个抽象类

namespace Microsoft.AspNet.SignalR
{
    //
    // 摘要:
    //     提供与连接到 Microsoft.AspNet.SignalR.Hub 的 SignalR 连接进行通信的方法。
    public abstract class Hub : HubBase
    {
        //
        // 摘要:
        //     初始化 Microsoft.AspNet.SignalR.Hub 类的新实例。
        protected Hub();
 
        //
        // 摘要:
        //     获取或设置与 SignalR 连接通信的客户端。
        //
        // 返回结果:
        //     与 SignalR 连接通信的客户端。(表示所有连接我的Hub上的客户端)
        [Dynamic(new[] { false, true })]
        public IHubCallerConnectionContext<dynamic> Clients { get; set; }
    }
}

再看看Hub类的父类HubBase类 :它是一个抽象方法

namespace Microsoft.AspNet.SignalR.Hubs
{
    public abstract class HubBase : IHub, IDisposable
    {
        protected HubBase();
		//本次连接的上下文(
        public HubCallerContext Context { get; set; }
		//用户分组
        public IGroupManager Groups { get; set; }
 
        public void Dispose();
		//客户端连接上的时候会调用此方法
        public virtual Task OnConnected();
		//客户端失去连接的时候会调用此方法
        public virtual Task OnDisconnected(bool stopCalled);
		//客户端可能网络不稳定,造成重新连接,就会调用此方法
        public virtual Task OnReconnected();
        protected virtual void Dispose(bool disposing);
    }
}

再来看看我们创建的Hub类中的属性类型,它是一个泛型接口

namespace Microsoft.AspNet.SignalR.Hubs
{
    public interface IHubCallerConnectionContext<T> : IHubConnectionContext<T>
    {
		//调用者,一般指的是我们的客户端(即:此时和我连接上的浏览器[这里的我值Hub])
        T Caller { get; }
		//调用者的状态,一般指的是我们浏览器的状态
        [Dynamic]
        dynamic CallerState { get; }
		//表示除了我之外的别人(因为有很多浏览器都是可以连接我们的Hub的,即:此时和我连接上的浏览器外的其他浏览器)
        T Others { get; }
 
		//在别的组里面的其他的客户端
        T OthersInGroup(string groupName);
        T OthersInGroups(IList<string> groupNames);
    }
}

在来看看IHubCallerConnectionContext<T>接口的父接口IHubConnectionContext<T>

namespace Microsoft.AspNet.SignalR.Hubs
{
    public interface IHubConnectionContext<T>
    {
		//表示和我连接的所有的客户端(我指Hub)
        T All { get; }
 
		//除了这个连接外的其他客户端
        T AllExcept(params string[] excludeConnectionIds);
		//表示某个连接ID对应的客户端
        T Client(string connectionId);
		//表示指定的多个连接ID的客户端
        T Clients(IList<string> connectionIds);
		//表示某个组中的除了excludeConnectionIds这连接之外的客户端
        T Group(string groupName, params string[] excludeConnectionIds);
        T Groups(IList<string> groupNames, params string[] excludeConnectionIds);
        T User(string userId);
        T Users(IList<string> userIds);
    }
}

再来看看HubBase中的Context这个属性的类型,它是一个HubCallerContext类型

namespace Microsoft.AspNet.SignalR.Hubs
{
    //
    // 摘要:
    //     表示客户端的调用上下文。
    public class HubCallerContext
    {
        //
        // 摘要:
        //     初始化 Microsoft.AspNet.SignalR.Hubs.HubCallerContext 类的新实例。
        //
        // 参数:
        //   request:
        //     当前的 HTTP 请求。
        //
        //   connectionId:
        //     连接 ID。
        public HubCallerContext(IRequest request, string connectionId);
        protected HubCallerContext();
 
        //
        // 摘要:
        //     获取调用客户端的连接 ID。
        //
        // 返回结果:
        //     调用客户端的连接 ID。(每个页面连接Hub,他们的连接ID都是不同的,同一个页面,如果刷新后,重新连接后,他们的连接ID也是不同的)
        public virtual string ConnectionId { get; }
        //
        // 摘要:
        //     获取请求的 Cookie。
        //
        // 返回结果:
        //     请求的 Cookie。
        public virtual IDictionary<string, Cookie> RequestCookies { get; }
        //
        // 摘要:
        //     获取请求的标头。
        //
        // 返回结果:
        //     请求的标头。
        public virtual INameValueCollection Headers { get; }
        //
        // 摘要:
        //     获取请求的查询字符串。
        //
        // 返回结果:
        //     请求的查询字符串。
        public virtual INameValueCollection QueryString { get; }
        //
        // 摘要:
        //     获取请求的 System.Security.Principal.IPrincipal。
        //
        // 返回结果:
        //     请求的 System.Security.Principal.IPrincipal。
        public virtual IPrincipal User { get; }
        //
        // 摘要:
        //     为当前 HTTP 请求获取 Microsoft.AspNet.SignalR.IRequest。
        //
        // 返回结果:
        //     当前 HTTP 请求的 Microsoft.AspNet.SignalR.IRequest。
        public virtual IRequest Request { get; }
    }
}

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
SignalR是一个开源的实时通信框架,它可以在客户端和服务器之间建立双向通信的连接。而SignalR WebSocket是SignalR框架中的一种传输方式,它基于WebSocket协议,提供了更高效、更实时的双向通信能力。 使用SignalR WebSocket可以实现以下功能: 1. 实时更新:服务器可以主动向客户端推送数据,实现实时更新的功能。 2. 即时聊天:多个客户端之间可以实时进行双向通信,实现即时聊天的功能。 3. 实时监控:服务器可以实时向客户端发送监控数据,客户端可以实时展示监控信息。 4. 实时通知:服务器可以向客户端发送通知,客户端可以及时收到并进行相应处理。 SignalR WebSocket的工作原理如下: 1. 客户端通过WebSocket协议与服务器建立连接。 2. 服务器通过SignalR框架接收和处理客户端的请求。 3. 服务器可以主动向客户端推送数据,也可以响应客户端的请求。 4. 客户端通过SignalR框架接收和处理服务器的响应或推送数据。 SignalR WebSocket具有以下特点: 1. 跨平台:SignalR WebSocket可以在多种平台上使用,包括.NET、Java、JavaScript等。 2. 自动重连:当连接断开时,SignalR WebSocket会自动尝试重新建立连接。 3. 可靠性:SignalR WebSocket具有自动重连和错误处理机制,可以保证通信的可靠性。 4. 扩展性:SignalR WebSocket可以与其他技术和框架结合使用,实现更复杂的功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值