public void Handle() { try { string mode = mRequestForms["mode"]; if (mode == "init") { this.mSendFunc(Guid.NewGuid().ToString()); } else if (mode == "heart") { string id = mRequestForms["id"]; if (ActivedVirtualWebSocketHandler.ContainsKey(id)) { var remotingHandler = (RemotingClientHandler)ActivedVirtualWebSocketHandler[id]; if (remotingHandler != null) { remotingHandler._heartTime = DateTime.Now; } } } else if (mode == "receive") { string id = mRequestForms["id"]; string binaryType = mRequestForms["binaryType"]; RemotingClientHandler remotingHandler; if (ActivedVirtualWebSocketHandler.ContainsKey(id)) { remotingHandler = (RemotingClientHandler)ActivedVirtualWebSocketHandler[id]; } else { remotingHandler = new ScriptRemoting.RemotingClientHandler(null, null, mClientIP, _Referer, _GetHeaderValueHandler); ActivedVirtualWebSocketHandler.Add(id, remotingHandler); } remotingHandler.Tag2 = true; if (remotingHandler.mSendDataFunc == null) { remotingHandler.mSendDataFunc = (data) => { try { int count = 0; while (remotingHandler.Tag1 == null && count < 2000) { System.Threading.Thread.Sleep(10); count++; } RemotingClientHandler.SendDataHandler func = remotingHandler.Tag1 as RemotingClientHandler.SendDataHandler; if (func == null) { if (ActivedVirtualWebSocketHandler.ContainsKey(id)) { remotingHandler.OnDisconnected(); ActivedVirtualWebSocketHandler.Remove(id); } remotingHandler.mCloseStreamHandler.Invoke(); return; } remotingHandler.Tag2 = false; remotingHandler.Tag1 = null; func.Invoke(data); } catch { } }; } remotingHandler.mCloseStreamHandler = () => { try { remotingHandler.OnDisconnected(); mCloseConnectionFunc(); ActivedVirtualWebSocketHandler.Remove(id); } catch { } }; remotingHandler.Tag1 = mSendFunc; if (mWaitForCloseFunc() == 0)//如果不是0,表示是mvc结构,无法检测socket的断开状态 { if ((bool)remotingHandler.Tag2) { remotingHandler.OnDisconnected(); if (ActivedVirtualWebSocketHandler.ContainsKey(id)) { ActivedVirtualWebSocketHandler.Remove(id); } } } return; } else if (mode == "send") { string data = mRequestForms["data"]; string id = mRequestForms["id"]; string binaryType = mRequestForms["binaryType"]; int count = 0; while (!ActivedVirtualWebSocketHandler.ContainsKey(id) && count < 300) { System.Threading.Thread.Sleep(10); count++; } if (ActivedVirtualWebSocketHandler.ContainsKey(id)) { RemotingClientHandler handler = (RemotingClientHandler)ActivedVirtualWebSocketHandler[id]; try { if (binaryType == "arraybuffer") { string[] strArr = data.Split('%'); byte[] bs = new byte[strArr.Length - 1]; for (int i = 1; i < strArr.Length; i++) { bs[i - 1] = (byte)Convert.ToInt32(strArr[i], 16); } handler.OnReceived(bs); } else { handler.OnReceived(data); } } catch { } } mSendFunc(""); } } catch { } //wait for close mWaitForCloseFunc(); }
public void Handle() { try { if (_context.Request.Headers.ContainsKey("Connection") == false) { _context.Response.Headers["Connection"] = "Keep-Alive"; } else { _context.Response.Headers["Connection"] = _context.Request.Headers["Connection"]; } //访问ts脚本 if (_context.Request.Headers["GET"].ToSafeString().EndsWith("/WayScriptRemoting", StringComparison.CurrentCultureIgnoreCase)) { outputFile(null, HttpServer.ScriptFilePath); } else if (_context.Request.Headers["POST"].ToSafeString().StartsWith("/wayscriptremoting_invoke?a=", StringComparison.CurrentCultureIgnoreCase)) { _context.Request.urlRequestHandler(); string json = _context.Request.Form["m"]; RemotingClientHandler rs = new ScriptRemoting.RemotingClientHandler((string data) => { _context.Response.WriteStringBody(data); }, null, _context.Request.RemoteEndPoint.ToString().Split(':')[0], (string)_context.Request.Headers["Referer"], (key) => { return(_context.Request.Headers[key]); }); rs.OnReceived(json); } else if (_context.Request.Headers["POST"].ToSafeString().StartsWith("/wayscriptremoting_recreatersa?a=", StringComparison.CurrentCultureIgnoreCase)) { _context.Request.urlRequestHandler(); string json = _context.Request.Form["m"]; RemotingClientHandler rs = new ScriptRemoting.RemotingClientHandler((string data) => { _context.Response.WriteStringBody(data); }, null, _context.Request.RemoteEndPoint.ToString().Split(':')[0], (string)_context.Request.Headers["Referer"], (key) => { return(_context.Request.Headers[key]); }); rs.handleReCreateRSA(json.FromJson <MessageBag>()); } else if (_context.Request.Headers["POST"].ToSafeString().EndsWith("?WayVirtualWebSocket=1", StringComparison.CurrentCultureIgnoreCase) || _context.Request.Headers["POST"].ToSafeString().EndsWith("&WayVirtualWebSocket=1", StringComparison.CurrentCultureIgnoreCase)) { _context.Request.urlRequestHandler(); new VirtualWebSocketHandler(_context.Request.Form, (data) => { _context.Response.WriteStringBody(data); }, () => { _context.Response.End(); return(0); }, () => { _context.Response.CloseSocket(); return(0); }, _context.Request.RemoteEndPoint.ToString().Split(':')[0], (string)_context.Request.Headers["Referer"], (key) => { return(_context.Request.Headers[key]); } ).Handle(); return; } else { string url = (_context.Request.Headers["GET"] == null ? _context.Request.Headers["POST"] : _context.Request.Headers["GET"]).ToSafeString(); if (url.Contains("?")) { MatchCollection matches = Regex.Matches(url, @"(?<n>(\w)+)\=(?<v>([^\=\&])+)"); foreach (Match m in matches) { _context.Request.Query[m.Groups["n"].Value] = WebUtility.UrlDecode(m.Groups["v"].Value); } url = url.Substring(0, url.IndexOf("?")); } string ext = Path.GetExtension(url).ToLower(); if (NotAllowDownloadFiles.Contains(ext)) { //不能访问dll exe等文件 throw new Exception("not allow"); } try { _context.Request.urlRequestHandler(); } catch (Exception ex) { } if ((_context.Server.Routers.Count > 0 || _context.Server.Handlers.Count > 0) && _currentHttpConnectInformation == null) { _currentHttpConnectInformation = new HttpConnectInformation(_context.Request, _context.Response); //先设一个默认controller,后面具体controller可以替换 _context.Controller = new RemotingController() { Session = _currentHttpConnectInformation.Session }; } url = getUrl(url); checkHandlers(url); if (_context.Response.mClient == null) { throw new Exception("ended"); } var controllerConfig = ControllerUrlConfig.FirstOrDefault(m => url.StartsWith(m.Key, StringComparison.CurrentCultureIgnoreCase) && url.Substring(m.Key.Length).Contains("/") == false); if (controllerConfig.Value != null) { RemotingClientHandler rs = new ScriptRemoting.RemotingClientHandler(null, null, _context.Request.RemoteEndPoint.ToString().Split(':')[0], null, null); rs.handleUrlMethod(controllerConfig.Value, url.Substring(controllerConfig.Key.Length)); } else { if (url.Length == 0 || url == "/") { url = _context.Server.WebPathManger.GetFileUrl("/index.html"); } if (Path.GetExtension(url).IsNullOrEmpty())//访问的路径如果没有扩展名,默认指向.html文件 { url = _context.Server.WebPathManger.GetFileUrl($"{url}.html"); } else { url = _context.Server.WebPathManger.GetFileUrl(url); } if (_context.Response.mClient != null) { string filepath = url; if (filepath.StartsWith("/")) { filepath = filepath.Substring(1); } filepath = Path.GetFullPath(_context.Server.Root + filepath); if (filepath.ToLower().Contains(_context.Server.Root.ToLower()) == false) { //访问了Root范围外文件 _context.Response.SendFileNotFound(); } else { outputFile(url, filepath); } } } } } catch (Exception ex) { } _context.Request.Dispose(); _context.Response.End(); }