Abpvnext使用sianalr实时通讯服务

1、安装依赖包

添加Volo.Abp.AspNetCore.SignalRNuGet包到你的项目:

Install-Package Volo.Abp.AspNetCore.SignalR

2、添加 AbpAspNetCoreSignalRModule 到你的模块的依赖列表

在你的HOST项目或者Web项目的Module中添加对应地依赖

[DependsOn(
    typeof(AbpAspNetCoreSignalRModule) //Add the new module dependency
    )]
public class YourModule : AbpModule
{
}

3、编写Hub集线器

public class UserHub : AbpHub
    {
        private const string method = "ReceiveMessage";//客户端接受信息的方法

         #region 连接和断开
        /// <summary>
        /// 连接
        /// </summary>
        /// <returns></returns>
        public override async Task OnConnectedAsync()
        {
            Logger.LogInformation($"UserHubConnected:tenantId:{CurrentTenant.Id},UserId{_myCurrentUser.Id?.ToString()}{_myCurrentUser.UserName}Connected SignalR");

            await base.OnConnectedAsync();
        }

        /// <summary>
        /// 断开连接
        /// </summary>
        /// <param name="exception"></param>
        /// <returns></returns>
        public override async Task OnDisconnectedAsync(Exception exception)
        {
            Logger.LogInformation($"UserHubDisconnected:tenantId:{CurrentTenant.Id},UserId{_myCurrentUser.Id?.ToString()}{_myCurrentUser.UserName} Disconnected signalR,ExceptionMessage:{exception?.Message}");

            await base.OnDisconnectedAsync(exception);
        }

        #endregion

       /// <summary>
        /// 进入模块编辑
        /// </summary>
        /// <param name="moduleName"></param>
        /// <returns></returns>
        public async Task ModuleEditStart(string moduleName)
        {
                await Clients.Group(moduleName).SendAsync(method, userIds);//给同组用户发送信息
                await Clients.User("用户id").SendAsync(method, userIds);//给单个用户发送信息
                await Clients.Users(new List<string> { "用户id1", "用户id2" }).SendAsync(method, userIds);//给多个用户发送信息
        }

        /// <summary>
        /// 离开模块编辑
        /// </summary>
        /// <param name="moduleName"></param>
        /// <returns></returns>
        public async Task ModuleEditEnd(string moduleName)
        {
            await Clients.Group(moduleName).SendAsync(method, "发送信息");
        }       
    }

 只需要集成AbpHub,不需要 services.AddSignalR() 和 app.UseEndpoints(...),它们在 AbpAspNetCoreSignalRModule 中已经添加了.

AbpHub中还有很多abp中常用的属性,可直接在自己的Hub里使用 

 

4、重写连接和断开加入日志

        /// <summary>
        /// 连接
        /// </summary>
        /// <returns></returns>
        public override async Task OnConnectedAsync()
        {
            Logger.LogInformation($"UserHubConnected:tenantId:{CurrentTenant.Id},UserId{_myCurrentUser.Id?.ToString()}{_myCurrentUser.UserName}Connected SignalR");

            await base.OnConnectedAsync();
        }
        /// <summary>
        /// 断开连接
        /// </summary>
        /// <param name="exception"></param>
        /// <returns></returns>
        public override async Task OnDisconnectedAsync(Exception exception)
        {
            Logger.LogInformation($"UserHubDisconnected:tenantId:{CurrentTenant.Id},UserId{_myCurrentUser.Id?.ToString()}{_myCurrentUser.UserName} Disconnected signalR,ExceptionMessage:{exception?.Message}");

            await base.OnDisconnectedAsync(exception);
        }      

5、用户认证信息

    [Authorize]
public class UserHub : AbpHub
    {
        \\\业务代码        
    }

加上[Authorize]表明需要认证才可访问

对应的Host或Web需要添加token验证

Module中ConfigureServices方法添加使用 JWT 持有者中间件配置持有者令牌身份验证

 context.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
 .AddJwtBearer(options =>
  {
      options.Authority = "Authority URL"; // TODO: Update URL

      options.Events = new JwtBearerEvents
      {
          OnMessageReceived = context =>
          {
              var accessToken = context.Request.Query["access_token"];

              var path = context.HttpContext.Request.Path;
               if (!string.IsNullOrEmpty(accessToken) &&
               (path.ToString().StartsWith("/signalr-hubs/")))
               {
                   context.Token = accessToken;
               }            
               return Task.CompletedTask;            
          }
      };
  });

/signalr-hubs/路径的token替换为请求中的access_token请求参数

6、客户端调用,js示例

<html>
<header>
    <script src="./jquery.js"></script>
    <script src="./node_modules/@microsoft/signalr/dist/browser/signalr.js"></script>
    <script>
        $(function () {
            var token = "你的token";
            var connection = new signalR.HubConnectionBuilder()
                .withUrl("/user", {
                    accessTokenFactory: () => token
                })
                .withUrl("http://localhost:5107/signalr-hubs/user")//hub地址,我们的集线器是userhub对应的地址http://localhost:5107/signalr-hubs/user
                .configureLogging(signalR.LogLevel.Information)//定义日志等级
                .withAutomaticReconnect()//开启自动重连
                .build();

            //接受服务端消息
            connection.on("ReceiveMessage", function (message) {
                console.log("reciveUsers");
                console.log(message);
            });

            //按钮触发集线器对应的方法ModuleEditStart
            $('#btn').click(function (e) {
                e.preventDefault();
                connection.invoke("ModuleEditStart", "dev")
                    .then(function () {
                        console.log("send")
                    })
                    .catch(function (err) {
                        return console.error(err.toString());
                    });
            });

             //按钮触发集线器对应的方法ModuleEditEnd
            $('#btnend').click(function (e) {
                e.preventDefault();
                connection.invoke("ModuleEditEnd", "dev")
                    .then(function () {
                        console.log("leave")
                    })
                    .catch(function (err) {
                        return console.error(err.toString());
                    });
            });

            //开始连接
            connection.start().then(function (res) {
                console.log("connection sucess")
                console.log(res)
            }).catch(function (err) {
                //连接异常发送错误信息
                return console.error(err.toString());
            });
        });
    </script>
</header>
<body>
    测试网页
    <input id="btn" type="button" value="startEdit" />

    <input id="btnend" type="button" value="endEdit" />
</body>
</html>

signalr.js安装ASP.NET Core SignalR JavaScript 客户端 | Microsoft Learn

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Abp框架提供了一些基本的数据访问方法,如GetAll, Get, Insert, Update, Delete等,它们可以满足大多数应用程序的需求。但是,如果需要执行复杂的SQL查询或操作,可以使用Dapper来执行原生SQL。Dapper是一个轻量级的ORM框架,可以在Abp应用程序中与Entity Framework Core一起使用。以下是一个使用Dapper执行原生SQL查询的示例: 1. 安装Dapper NuGet包 可以使用NuGet包管理器或在项目文件中手动添加以下条目来安装Dapper: ``` Install-Package Dapper ``` 2. 创建DapperRepository 我们可以创建一个名为DapperRepository的仓储类,它将使用Dapper执行原生SQL查询或操作。以下是一个简单的DapperRepository类的示例: ``` public class DapperRepository<TEntity> : IRepository<TEntity> where TEntity : class, IEntity<int> { private readonly IDbConnection _dbConnection; public DapperRepository(IDbConnection dbConnection) { _dbConnection = dbConnection; } public async Task<List<TEntity>> GetAllListAsync() { return (await _dbConnection.GetListAsync<TEntity>()).ToList(); } public async Task<TEntity> GetAsync(int id) { return await _dbConnection.GetAsync<TEntity>(id); } public async Task<TEntity> InsertAsync(TEntity entity) { entity.Id = await _dbConnection.InsertAsync(entity); return entity; } public async Task<TEntity> UpdateAsync(TEntity entity) { await _dbConnection.UpdateAsync(entity); return entity; } public async Task DeleteAsync(int id) { await _dbConnection.DeleteAsync<TEntity>(id); } public async Task<List<TEntity>> QueryAsync(string sql, object param = null) { return (await _dbConnection.QueryAsync<TEntity>(sql, param)).ToList(); } public async Task<TEntity> QueryFirstOrDefaultAsync(string sql, object param = null) { return await _dbConnection.QueryFirstOrDefaultAsync<TEntity>(sql, param); } } ``` 3. 注册DapperRepository 在应用程序的Startup.cs文件中,我们可以使用依赖注入将DapperRepository注册到容器中: ``` services.AddScoped(typeof(IRepository<>), typeof(DapperRepository<>)); ``` 4. 使用DapperRepository执行查询 现在我们可以在应用程序中使用DapperRepository来执行原生SQL查询或操作。以下是一个使用DapperRepository执行查询的示例: ``` public class MyService : IMyService { private readonly IRepository<MyEntity> _repository; public MyService(IRepository<MyEntity> repository) { _repository = repository; } public async Task<List<MyEntity>> GetEntitiesWithComplexQueryAsync() { string sql = "SELECT * FROM MyEntities WHERE MyProperty = @myParam"; var parameters = new { myParam = "someValue" }; return await _repository.QueryAsync(sql, parameters); } } ``` 在上面的示例中,我们使用DapperRepository执行了一个带有参数的原生SQL查询,并将结果作为MyEntity对象列表返回。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值