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; }
    }
}

猜你喜欢

转载自blog.csdn.net/Fanbin168/article/details/81107221