private void handleErrorWebResponse(HttpWebResponse pWebResp, CompletionHandler pCompletionHandler, Exception pExp) { DateTime startTime = DateTime.Now; int statusCode = ResponseInfo.NetworkError; //parse self defined code from the error message string expMsg = pExp.Message; int indexStart = expMsg.IndexOf("("); if (indexStart != -1) { int indexEnd = expMsg.IndexOf(")", indexStart); if (indexStart != -1 && indexEnd != -1) { string statusCodeStr = expMsg.Substring(indexStart + 1, indexEnd - indexStart - 1); try { statusCode = Convert.ToInt32(statusCodeStr); } catch (Exception) { } } } //check for exception string reqId = null; string xlog = null; string ip = null; string xvia = null; string error = null; string host = null; string respData = null; int contentLength = -1; bool recvInvalid = false; if (pWebResp != null) { if (pWebResp.Headers != null) { WebHeaderCollection respHeaders = pWebResp.Headers; foreach (string headerName in respHeaders.AllKeys) { if (headerName.Equals("X-Reqid")) { reqId = respHeaders[headerName].ToString(); } else if (headerName.Equals("X-Log")) { xlog = respHeaders[headerName].ToString(); } else if (headerName.Equals("X-Via")) { xvia = respHeaders[headerName].ToString(); } else if (headerName.Equals("X-Px")) { xvia = respHeaders[headerName].ToString(); } else if (headerName.Equals("Fw-Via")) { xvia = respHeaders[headerName].ToString(); } else if (headerName.Equals("Host")) { host = respHeaders[headerName].ToString(); } else if (headerName.Equals("Content-Length")) { contentLength = int.Parse(respHeaders[headerName].ToString()); } } } using (StreamReader respStream = new StreamReader(pWebResp.GetResponseStream())) { respData = respStream.ReadToEnd(); if (contentLength > 0) { if (respData.Length != contentLength) { recvInvalid = true; } } } try { ///////////////////////////////////////////////////////////// // 改进Response的error解析, 根据HttpStatusCode // @fengyh 2016-08-17 18:29 ///////////////////////////////////////////////////////////// if (statusCode != (int)HCODE.OK) { bool isOtherCode = HttpCode.GetErrorMessage(statusCode, out error); if (isOtherCode) { Dictionary <string, string> errorDict = JsonConvert.DeserializeObject <Dictionary <string, string> >(respData); error = errorDict["error"]; } } } catch (Exception) { } if (recvInvalid) { statusCode = -1; string err = string.Format("response-recv is not complete RECV={0},TOTAL={1} {2}", respData.Length, contentLength, error); Console.WriteLine(err); error = err; } pWebResp.Close(); } else { error = pExp.Message; } double duration = DateTime.Now.Subtract(startTime).TotalSeconds; ResponseInfo respInfo = new ResponseInfo(statusCode, reqId, xlog, xvia, host, ip, duration, error); if (pCompletionHandler != null) { pCompletionHandler(respInfo, respData); } }