소스 검색

😁优化SignalR相关

zuohuaijun 2 년 전
부모
커밋
ad758e6ebd

+ 1 - 1
Admin.NET/Admin.NET.Core/Admin.NET.Core.csproj

@@ -38,7 +38,7 @@
     <PackageReference Include="SixLabors.ImageSharp.Web" Version="3.1.0" />
     <PackageReference Include="SKIT.FlurlHttpClient.Wechat.Api" Version="2.35.0" />
     <PackageReference Include="SKIT.FlurlHttpClient.Wechat.TenpayV3" Version="2.20.1" />
-    <PackageReference Include="SqlSugarCore" Version="5.1.4.128" />
+    <PackageReference Include="SqlSugarCore" Version="5.1.4.129" />
     <PackageReference Include="System.Linq.Dynamic.Core" Version="1.3.7" />
     <PackageReference Include="UAParser" Version="3.1.47" />
     <PackageReference Include="Yitter.IdGenerator" Version="1.0.14" />

+ 9 - 4
Admin.NET/Admin.NET.Core/Hub/OnlineUserHub.cs

@@ -42,9 +42,13 @@ public class OnlineUserHub : Hub<IOnlineUserHub>
     /// <returns></returns>
     public override async Task OnConnectedAsync()
     {
-        var token = Context.GetHttpContext().Request.Query["access_token"];
-        var claims = JWTEncryption.ReadJwtToken(token)?.Claims;
-        var client = Parser.GetDefault().Parse(Context.GetHttpContext().Request.Headers["User-Agent"]);
+        //var token = Context.GetHttpContext().Request.Query["access_token"];
+        //var claims = JWTEncryption.ReadJwtToken(token)?.Claims;
+        //var client = Parser.GetDefault().Parse(Context.GetHttpContext().Request.Headers["User-Agent"]);
+
+        var httpContext = Context.GetHttpContext();
+        var claims = httpContext.User.Claims;
+        var client = Parser.GetDefault().Parse(httpContext.Request.Headers["User-Agent"]);
 
         var userId = claims.FirstOrDefault(u => u.Type == ClaimConst.UserId)?.Value;
         var tenantId = claims.FirstOrDefault(u => u.Type == ClaimConst.TenantId)?.Value;
@@ -55,7 +59,8 @@ public class OnlineUserHub : Hub<IOnlineUserHub>
             UserName = claims.FirstOrDefault(u => u.Type == ClaimConst.Account)?.Value,
             RealName = claims.FirstOrDefault(u => u.Type == ClaimConst.RealName)?.Value,
             Time = DateTime.Now,
-            Ip = App.HttpContext.GetRemoteIpAddressToIPv4(),
+            //Ip = App.HttpContext.GetRemoteIpAddressToIPv4(),
+            Ip = httpContext.Connection.RemoteIpAddress.ToString(),
             Browser = client.UA.Family + client.UA.Major,
             Os = client.OS.Family + client.OS.Major,
             TenantId = string.IsNullOrWhiteSpace(tenantId) ? 0 : Convert.ToInt64(tenantId),

+ 20 - 0
Admin.NET/Admin.NET.Core/Hub/UserIdProvider.cs

@@ -0,0 +1,20 @@
+// 麻省理工学院许可证
+//
+// 版权所有 (c) 2021-2023 zuohuaijun,大名科技(天津)有限公司  联系电话/微信:18020030720  QQ:515096995
+//
+// 特此免费授予获得本软件的任何人以处理本软件的权利,但须遵守以下条件:在所有副本或重要部分的软件中必须包括上述版权声明和本许可声明。
+//
+// 软件按“原样”提供,不提供任何形式的明示或暗示的保证,包括但不限于对适销性、适用性和非侵权的保证。
+// 在任何情况下,作者或版权持有人均不对任何索赔、损害或其他责任负责,无论是因合同、侵权或其他方式引起的,与软件或其使用或其他交易有关。
+
+using Microsoft.AspNetCore.SignalR;
+
+namespace Admin.NET.Core;
+
+public interface UserIdProvider : IUserIdProvider
+{
+    public new string GetUserId(HubConnectionContext connection)
+    {
+        return connection.User?.Claims?.FirstOrDefault(u => u.Type == ClaimConst.UserId)?.Value;
+    }
+}

+ 2 - 0
Admin.NET/Admin.NET.Core/Service/Message/SysMessageService.cs

@@ -67,6 +67,8 @@ public class SysMessageService : IDynamicApiController, ITransient
         var user = _sysCacheService.Get<SysOnlineUser>(CacheConst.KeyUserOnline + input.UserId);
         if (user == null) return;
         await _chatHubContext.Clients.Client(user.ConnectionId).ReceiveMessage(input);
+        // 可以直接通过用户Id发消息
+        //await _chatHubContext.Clients.User(user.UserId.ToString()).ReceiveMessage(input);
     }
 
     /// <summary>

+ 2 - 0
Admin.NET/Admin.NET.Web.Core/Startup.cs

@@ -17,6 +17,7 @@ using IGeekFan.AspNetCore.Knife4jUI;
 using Microsoft.AspNetCore.Builder;
 using Microsoft.AspNetCore.Hosting;
 using Microsoft.AspNetCore.HttpOverrides;
+using Microsoft.AspNetCore.SignalR;
 using Microsoft.Extensions.DependencyInjection;
 using Microsoft.Extensions.Hosting;
 using Newtonsoft.Json;
@@ -129,6 +130,7 @@ public class Startup : AppStartup
 
         // 即时通讯
         services.AddSignalR(SetNewtonsoftJsonSetting);
+        //services.AddSingleton<IUserIdProvider, UserIdProvider>();
 
         // 系统日志
         services.AddLoggingSetup();