// 1、Content negotiation private WSNegotiation Negotiate() { WSNegotiation negotiation = new WSNegotiation(); IRestRequest request = new RestRequest("signalr/negotiate", Method.GET); string connectionDatasJson = JsonConvert.SerializeObject(this.ConnectionData); request.AddQueryParameter("connectionData", connectionDatasJson); request.AddQueryParameter("clientProtocol", "2.1"); IRestResponse response = restClient.Execute(request); if (response.StatusCode == HttpStatusCode.OK) { if (!string.IsNullOrEmpty(response.Content)) { negotiation = JsonConvert.DeserializeObject <WSNegotiation>(response.Content); } } this.WSNegotiation = negotiation; return(negotiation); }
/// <summary> /// Connect to the server /// </summary> public void Open() { WSNegotiation negotiation = this.Negotiate(); if (!string.IsNullOrEmpty(negotiation.ConnectionToken)) { this.Connect(negotiation); } else { this.StartConnectTimer(); } }
// 2、Create websocket connection private void Connect(WSNegotiation negotiation) { string token = HttpUtility.UrlEncode(negotiation.ConnectionToken); string connectionDatasJson = JsonConvert.SerializeObject(this.ConnectionData); string path = string.Format(@"{0}/signalr/connect?transport=webSockets&clientProtocol={1}&connectionToken={2}&connectionData={3}", this.WebSocketBaseUrl, negotiation.ProtocolVersion, token, connectionDatasJson); webSocket = new WebSocket(path); webSocket.Opened += WebSocket_Opened; webSocket.Closed += WebSocket_Closed; webSocket.MessageReceived += WebSocket_MessageReceived; webSocket.Open(); }