/// <summary> /// 对信道服务器使用 POST 方法推送到业务服务器的报文进行处理 /// </summary> /// <param name="handler">客户使用的信道服务处理实例,用于处理解析之后的包</param> private void HandlePost(ITunnelHandler handler, TunnelHandleOptions options) { using (SdkDebug.WriteLineAndIndent($"> 收到信道服务器 POST 过来的报文 (Time: {DateTime.Now.ToString("HH:mm:ss")})")) { DoHandlePost(handler); } }
/// <summary> /// 处理 WebSocket 信道请求 /// </summary> /// <param name="handler">提供 WebSocket 信道处理器处理信道事件</param> /// <param name="options">可选,配置处理选项</param> /// <returns>返回任务进行跟踪,任务完成表示信道处理完成</returns> public void Handle(ITunnelHandler handler, TunnelHandleOptions options = null) { if (Request.Method.ToUpper() == "GET") { HandleGet(handler, options); } if (Request.Method.ToUpper() == "POST") { HandlePost(handler, options); } }
/// <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); }