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(); }
/// <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); }