public void SendGameRequest(Msg.Code code, long uid, object o = null, object ctx = null) { queue.Enqueue(() => { Stream dataStreamSend = null; WebResponse response = null; StreamReader reader = null; Stream dataStreamRecv = null; try { var url = gameServerURL + "?uid=" + uid + "&code=" + (int)code; HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(url); request.Method = "POST"; request.Timeout = 3 * 1000; request.ReadWriteTimeout = 3 * 1000; byte[] byteArray = new byte[] { }; if (o != null) { byteArray = Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(o)); } request.ContentLength = byteArray.Length; dataStreamSend = request.GetRequestStream(); dataStreamSend.Write(byteArray, 0, byteArray.Length); dataStreamSend.Close(); response = request.GetResponse(); dataStreamRecv = response.GetResponseStream(); reader = new StreamReader(dataStreamRecv); string responseFromServer = reader.ReadToEnd(); callback.OnResponse(code, responseFromServer, ctx); } catch (WebException ex) { using (HttpWebResponse res = (HttpWebResponse)ex.Response) { switch (res.StatusCode) { case HttpStatusCode.BadRequest: case HttpStatusCode.InternalServerError: var errRet = Msg.MakeErrorResponse(code, uid, (int)Msg.Err.ErrSendFailure, res.ToString()); if (errRet == null) { callback.OnError(ex); } else { callback.OnResponse(code, errRet, ctx); } break; default: callback.OnError(ex); break; } } } catch (Exception ex) { // shit happen ... 待处理 callback.OnError(ex); } finally { if (dataStreamSend != null) { dataStreamSend.Close(); } if (response != null) { response.Close(); } if (reader != null) { reader.Close(); } if (dataStreamRecv != null) { dataStreamRecv.Close(); } } }); }