示例#1
0
        /// <summary>
        /// 处理 WebSocket 信道 GET 请求
        /// </summary>
        ///
        /// <remarks>
        /// GET 请求表示客户端请求进行信道连接,此时会向 SDK 申请信道连接地址,并且返回给客户端
        /// 如果配置指定了要求登陆,还会调用登陆服务来校验登陆态并获得用户信息
        /// </remarks>
        private void HandleGet(ITunnelHandler handler, TunnelHandleOptions options)
        {
            Configuration config = ConfigurationManager.CurrentConfiguration;

            Tunnel   tunnel = null;
            UserInfo user   = null;

            // 要求登录态,获取用户信息
            if (options?.CheckLogin == true)
            {
                try
                {
                    LoginService loginService = new LoginService(Request, Response);
                    user = loginService.Check();
                }
                catch
                {
                    // 要求检查登录态的话,发生异常就结束了
                    return;
                }
            }

            // 申请 WebSocket 信道连接地址
            TunnelAPI tunnelApi = new TunnelAPI();

            try
            {
                tunnel = tunnelApi.RequestConnect(BuildReceiveUrl());
            }
            catch (Exception e)
            {
                Response.WriteJson(new { error = e.Message });
                throw e;
            }

            // 输出 URL 结果
            Response.WriteJson(new { url = tunnel.ConnectUrl });

            handler.OnTunnelRequest(tunnel, user);
        }
示例#2
0
        /// <summary>
        /// 关闭当前信道
        /// </summary>
        /// <returns>返回信道关闭送结果,可能包含无效信道列表</returns>
        /// <exception cref="EmitException">网络不可用或信道服务器不可用</exception>
        public EmitResult Close()
        {
            TunnelAPI api = new TunnelAPI();

            return(api.EmitPacket(new string[] { Id }, "close", null));
        }
示例#3
0
        /// <summary>
        /// 通过信道发送消息
        /// </summary>
        /// <param name="messageType">消息类型</param>
        /// <param name="messageContent">消息内容,可以为任意类型,不过对象必须可以被序列化,建议使用 JSONObject</param>
        /// <returns>返回信道发送结果,可能包含无效信道列表</returns>
        /// <exception cref="EmitException">网络不可用或信道服务器不可用</exception>
        public EmitResult Emit(string messageType, object messageContent = null)
        {
            TunnelAPI api = new TunnelAPI();

            return(api.EmitMessage(new string[] { Id }, messageType, messageContent));
        }
示例#4
0
        /// <summary>
        /// 发送消息到房间里的所有信道
        /// </summary>
        /// <param name="messageType">消息类型</param>
        /// <param name="messageContent">消息内容,可以为任意类型,不过对象必须可以被序列化</param>
        /// <returns>返回信道发送结果,可能包含无效信道列表</returns>
        /// <exception cref="EmitException">网络不可用或信道服务器不可用</exception>
        public EmitResult Broadcast(string messageType, object messageContent)
        {
            TunnelAPI api = new TunnelAPI();

            return(api.EmitMessage(Tunnels.Select(x => x.Id), messageType, messageContent));
        }