zoukankan      html  css  js  c++  java
  • ASP.NET Core SignalR (四)【上】:在SignalR中使用 中心(hubs)

    此为系列文章,对MSDN ASP.NET Core SignalR 的官方文档进行系统学习与翻译。其中或许会添加本人对 ASP.NET Core 的浅显理解。

    什么是SignalR 的 中心

            SignalR hubs API 使你能够从服务端调用已连接的客户端的方法。在服务端代码,你可以定义被客户端调用的方法。而在客户端,你可以定义从服务端调用的方法。SignalR负责使得实时服务端到客户端以及客户端到服务端的通信成为可能的场景之后的所有事情。

    配置SignalR 中心

            SignalR 中间件需要一些服务,其通过调用 services.AddSignalR 来进行配置。

    services.AddSignalR();

           当为ASP.NET Core app 添加了 SignalR 功能时,通过调用endpoint.MapHub 来设置SignalR路由,其位于Startup.Configure 方法中的app.UseEndpoints 回调中。

    app.UseRouting();
    app.UseEndpoints(endpoints =>
    {
        endpoints.MapHub<ChatHub>("/chathub");
    });

    创建以及使用 中心(hubs)

           通过声明一个继承自 Hub 的类来声明一个中心,并为这个新建的类添加公共的方法。客户端可以调用被定义为public 的方法。

    public class ChatHub : Hub
    {
        public Task SendMessage(string user, string message)
        {
            return Clients.All.SendAsync("ReceiveMessage", user, message);
        }
    }

           你可以指定返回类型以及参数,包括复杂的类型以及数组,如同你在任何C#方法中所做的那样。SignalR会处理在你的参数以及返回值中的复杂对象的序列化以及反序列化的。

          注意:中心(hubs)是瞬变的(transient) 。

    • 不要在 中心 类的属性中存储状态。每一个 中心 方法的调用都是在一个新的 中心 实例上进行的。 
    • 当调用依赖于 中心 保存活动的异步方法时,请使用await。举个例子,形如这样的方法调用Clients.All.SendAsync(...) 如果其在没有await 的情况下被调用,那么其会失败,这是因为 中心 方法 会在 SendAsync 结束之前完成。

    上下文对象

           中心 类包含一个上下文对象,其包含了下列可以提供连接信息的一些属性:

    PropertyDescription
    ConnectionId 获取连接的唯一ID,其由SignalR分配。每一个连接都会有一个连接ID.
    UserIdentifier 获取用户身份,默认的,SignalR使用 与连接关联的ClaimsPrincipal  的 ClaimTypes.NameIdentifier 作为用户标识
    User 获取与当前用户关联的ClaimsPrincipal。
    Items 获取可用于在此连接的范围内共享数据的键/值集合。 数据可以存储在此集合中,它将在不同的中心方法调用中持久保存。
    Features 获取连接上的可用功能的集合。 目前,在大多数情况下不需要此集合,因此不会对其进行详细介绍。
    ConnectionAborted 获取在连接中止时通知的 CancellationToken

           Hub.Context 也包含了如下的方法:

    方法描述
    GetHttpContext 返回对于此连接的HttpContext对象,如果这个连接没有关联一个HTTP 请求,那么便会返回 null。对于HTTP 连接,你可以使用此方法来获取例如HTTP请求头以及查询字符串之类的信息。
    Abort 终止连接

    客户端对象

           Hub 类 具有一个 Clients 对象,其为了服务端与客户端之前的通信包含了如下属性:

    属性描述
    All 在所有已连接的客户端上调用一个方法
    Caller  在调用中心方法的客户端上调用一个方法
    Others 在除过调用中心 方法的那个客户端之外的所有客户端上调用一个方法

           Hub.Clients 同样也包含了如下方法:

    MethodDescription
    AllExcept 除过特定的连接外,在所有已连接的客户端上调用一个方法
    Client 在一个特定的已连接的客户端上调用一个方法
    Clients 在特定的已连接的客户端上调用一个方法
    Group 在特定分组的所有连接上调用一个方法
    GroupExcept 在一个特定分组除了特定连接之外的其他所有连接上调用一个方法
    Groups 在多个分组连接上调用一个方法
    OthersInGroup 在一个分组的连接上调用方法,而不包含调用 中心 方法的那个连接
    User 在一个特定用户关联的所有连接上调用方法
    Users 在多个特定用户关联的所有连接上调用方法

           上表中的每一个属性都会返回一个带有SendAsync方法的对象。SendAsync 方法允许你提供客户端方法的名称和参数用以调用。

  • 相关阅读:
    jmeter压测:failed (99: Cannot assign requested address) while connecting to upstream,问题解决
    linux主机设置免密登录
    linux环境 jdk+mysql+redis安装初始化步骤
    互联网系统设计原则
    LINUX运维常用命令
    性能测试岗位常见面试题
    查看电脑已连接过的WIFI密码
    Jenkins安装后,安装插件失败。报错SunCertPathBuilderException
    【java】javac命令在win10不可用,提示javac不是内部或外部命令,也不是可运行的程序【解决方法】
    .NET跨平台实践:.NetCore、.Net5/6 Linux守护进程设计
  • 原文地址:https://www.cnblogs.com/qianxingmu/p/12523727.html
Copyright © 2011-2022 走看看