ABP core集成SignalR(基于.Net core 2.0)(一)

admin 694

当.Net core出来的时候,SignalR这些还是活在.Net Framework的世界中,直到后来,微软良心发现,把SignalR Core版本放到aspnetcore下边,这时候在aspnetcore项目中才有用SignalR的希望。

但是SingalRCore是从.net standar 2.0 开始支持的,即使现在,也还没发布正式版。

所以,在ABP Core版中要使用SignalR,需要将ABP升级到3.0以上,因为ABP3.0的依赖才是.Net standar 2.0,之前版本最高到1.6.

所以,写安装包:

Microsoft.AspNetCore.SignalR (目前都是alpha版本,所以要到myget安装)

然后写个Hub:

public class CommonHub : Hub, ITransientDependency
    {
        public ILogger Logger { get; set; }

        private IHttpContextAccessor _httpContextAccessor;

        public CommonHub(IHttpContextAccessor httpContextAccessor)
        {
            _httpContextAccessor = httpContextAccessor;
            Logger = NullLogger.Instance;
        }
        public void Register()
        {
            Logger.Debug("A client is registered: " + Context.ConnectionId);
        }
        public override async Task OnConnectedAsync()
        {
            await base.OnConnectedAsync();
            Logger.Debug("A client is connected: " + client);
            
        }
        public override async Task OnDisconnectedAsync(Exception exception)
        {
            await base.OnDisconnectedAsync(exception);
            Logger.Debug("A client is disconnected: " + Context.ConnectionId);
        }

然后在网站项目的Startup中配置服务和地址:

先注册

//services.AddSignalR();
services.AddSockets();
services.AddSignalRCore();

再使用

app.UseSignalR(routes =>
            {
                routes.MapHub("signalr/hubs/commonHub");
            });

这样后端就算是配好了。

接着再来前面的,Web端肯定用脚本来链接沟通了:

上github找到AspNetCore->SignalR项目,下载下来(你问我为什么?因为它的脚本是单独放一个项目的,没直接给你)

下载下来后,生成,gulp...

生成一个signalr-client.js的脚本,把这个脚本复制到Web项目里,在页面中引用

接下来就是链接通信了:

let transportType = signalR.TransportType[getParameterByName('transport')] || signalR.TransportType.WebSockets;
    //let logger = new signalR.ConsoleLogger(signalR.LogLevel.minimumLogLevel);//你问我这句为什么注释,我哪知道,源码里这个Logger,生成的js里就是没有,我能怎么着
    let http = new signalR.HttpConnection(`http://${document.location.host}/signalr/hubs/commonHub`, { transport: transportType/*, logger: logger*/ });
    let commonHub = new signalR.HubConnection(http);
    commonHub.connect = function () {
        commonHub.start();
        console.log('signalr connected');
    };
    commonHub.connect();

脚本一放,启动、刷新

看到console里出来signalr connected Web项目日志有A client is connected:  那就说明已经连接上了

That's All.