Exemplo n.º 1
0
 public WebSocketMiddleware(
     AppFunc next,
     WebSocketOption option
 )
 {
     this.next = next;
     bufferSize = option.BufferSize;
     path = option.Path;
     logger = option.Logger;
 }
        public static IAppBuilder UseWebSocketMiddleware(this IAppBuilder source, WebSocketOption option)
        {
            var sessionManager = option.SessionManager;

            return source.MapWhen(
                ctx => ctx.Get<WebSocketAccept>(Constants.OWIN_WEBSOCKET_ACCEPT) != null,
                app =>
                {
                    app.Use(typeof(WebSocketMiddleware), option);
                    WebSocketMiddleware.RaiseConnected += sessionManager.HandleClientConnected;
                    WebSocketMiddleware.RaiseDisconnected += sessionManager.HandleClientDisconnected;
                    WebSocketMiddleware.RaiseReceivedMessage += sessionManager.HandleMessage;
                });
        }
        public WebSocketHandler(
            IOptions <WebSocketOption> options,
            IWebSocketRepository webSocketRepository,
            OnlineUserRepository onlineUserRepository,
            ILogger <WebSocketHandler> logger,
            IServiceProvider serviceProvider,
            IUserService userService,
            LockService lockService)
        {
            _webSocketRepository  = webSocketRepository;
            _onlineUserRepository = onlineUserRepository;
            _logger          = logger;
            _serviceProvider = serviceProvider;
            _userService     = userService;
            _lockService     = lockService;
            _random          = new Random();
            _options         = options.Value;

            StartBackgroundWorks();
        }
Exemplo n.º 4
0
        /// <summary>
        /// 注入服务
        /// </summary>
        /// <param name="services"></param>
        /// <returns></returns>
        public static IServiceCollection AddNarutoWebSocket <TService>(this IServiceCollection services, Action <WebSocketOption> option) where TService : NarutoWebSocketService
        {
            if (services.BuildServiceProvider().GetService <IWebSocketOptionFactory>() == null)
            {
                services.AddSingleton(typeof(IGroupStorage <>), typeof(InMemoryGroupStorage <>));
                services.AddSingleton(typeof(IWebSocketClientStorage <>), typeof(InMemoryWebSocketClientStorage <>));
                services.AddSingleton(typeof(IClientSend <>), typeof(ClientSend <>));
                services.AddSingleton(typeof(IAllClient <>), typeof(AllClient <>));
                services.AddSingleton(typeof(IOtherClient <>), typeof(OtherClient <>));
                services.AddSingleton(typeof(ICurrentClient <>), typeof(CurrentClient <>));
                services.AddSingleton(typeof(IGroupClient <>), typeof(GroupClient <>));
                services.AddSingleton(typeof(IClusterAllClient <>), typeof(AllClient <>));
                services.AddSingleton(typeof(IClusterOtherClient <>), typeof(OtherClient <>));
                services.AddSingleton(typeof(IClusterCurrentClient <>), typeof(CurrentClient <>));
                services.AddSingleton(typeof(IClusterGroupClient <>), typeof(GroupClient <>));
                services.AddSingleton <IEventBusProxy, EventBusProxy>();
                services.AddSingleton <IMessageReviceHandler, MessageReviceHandler>();
                services.AddSingleton <IWebSocketOptionFactory, WebSocketOptionFactory>();

                services.AddScoped(typeof(CurrentContext <>));
                services.AddScoped(typeof(IReplyClient <>), typeof(ReplyClient <>));
            }

            services.AddScoped <TService>();

            //获取配置
            WebSocketOption webSocketOption = new WebSocketOption();

            option?.Invoke(webSocketOption);
            //匹配是否存在
            if (!TenantPathCache.Match(webSocketOption.Path))
            {
                //获取服务类型
                webSocketOption.ServiceType = typeof(TService);
                //添加进路由缓存
                TenantPathCache.Add(webSocketOption.Path, webSocketOption.ServiceType);
                //注入配置服务
                services.Add(new ServiceDescriptor(MergeNamedType.Merge(webSocketOption.Path.ToString(), typeof(WebSocketOption)), serviceProvider => webSocketOption, ServiceLifetime.Singleton));
            }
            return(services);
        }