using System; using System.Collections.Generic; using System.Text; using System.IO; using System.Net; using POSV.Common.Util; namespace POSV.Common.Http { /// /// HttpManager for .NET 2.0/3.0/3.5/4.0 /// public class HttpManager { private bool allowAutoRedirect; private string userAgent; /// /// 初始化 /// /// 是否允许HttpWebRequest的“重定向”,默认禁止 public HttpManager(bool allowAutoRedirect = false) { this.allowAutoRedirect = allowAutoRedirect; userAgent = GetUserAgent(); } /// /// 客户端标识(UserAgent),示例:"SepcifiedClient/1.1 (Universal)" /// /// 客户端标识UA public static string GetUserAgent() { string osDesc = Environment.OSVersion.Platform + "; " + Environment.OSVersion.Version; return string.Format("{0}/{1} ({2}; {3})", CSharpSDK.ALIAS, CSharpSDK.VERSION, CSharpSDK.RTFX, osDesc); } /// /// 设置自定义的客户端标识(UserAgent),示例:"SepcifiedClient/1.1 (Universal)" /// 如果设置为空白或者不设置,SDK会自动使用默认的UserAgent /// /// 用户自定义的UserAgent /// 客户端标识UA public void SetUserAgent(string userAgent) { if(!string.IsNullOrEmpty(userAgent)) { this.userAgent = userAgent; } } /// /// 多部分表单数据(multi-part form-data)的分界(boundary)标识 /// /// 分界(boundary)标识字符串 public static string CreateFormDataBoundary() { string now = DateTime.UtcNow.Ticks.ToString(); return string.Format("-------{0}Boundary{1}", CSharpSDK.ALIAS, Hashing.CalcMD5X(now)); } public HttpResult Get(string url, string token, bool binaryMode = false) { return Get(url, token, 20000, binaryMode); } /// /// HTTP-GET方法 /// /// 请求目标URL /// 令牌(凭证)[可选->设置为null] /// 是否以二进制模式读取响应内容(默认:否,即表示以文本方式读取) /// HTTP-GET的响应结果 public HttpResult Get(string url, string token, int millTimeOut, bool binaryMode = false) { HttpResult result = new HttpResult(); HttpWebRequest wReq = null; try { wReq = WebRequest.Create(url) as HttpWebRequest; wReq.Method = "GET"; if (!string.IsNullOrEmpty(token)) { wReq.Headers.Add("Authorization", token); } wReq.UserAgent = userAgent; wReq.AllowAutoRedirect = allowAutoRedirect; wReq.ServicePoint.Expect100Continue = false; wReq.Timeout = millTimeOut; HttpWebResponse wResp = wReq.GetResponse() as HttpWebResponse; if (wResp != null) { result.Code = (int)wResp.StatusCode; result.RefCode = (int)wResp.StatusCode; getHeaders(ref result, wResp); if (binaryMode) { int len = (int)wResp.ContentLength; result.Data = new byte[len]; int bytesLeft = len; int bytesRead = 0; using (BinaryReader br = new BinaryReader(wResp.GetResponseStream())) { while (bytesLeft > 0) { bytesRead = br.Read(result.Data, len - bytesLeft, bytesLeft); bytesLeft -= bytesRead; } } } else { using (StreamReader sr = new StreamReader(wResp.GetResponseStream())) { result.Text = sr.ReadToEnd(); } } wResp.Close(); } } catch (WebException wex) { HttpWebResponse xResp = wex.Response as HttpWebResponse; if (xResp != null) { result.Code = (int)xResp.StatusCode; result.RefCode = (int)xResp.StatusCode; getHeaders(ref result, xResp); using (StreamReader sr = new StreamReader(xResp.GetResponseStream())) { result.Text = sr.ReadToEnd(); } xResp.Close(); } } catch (Exception ex) { StringBuilder sb = new StringBuilder(); sb.AppendFormat("[{0}] [{1}] [HTTP-GET] Error: ", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.ffff"),userAgent); Exception e = ex; while (e != null) { sb.Append(e.Message + " "); e = e.InnerException; } sb.AppendLine(); result.RefCode = (int)HttpCode.USER_UNDEF; result.RefText += sb.ToString(); } finally { if (wReq != null) { wReq.Abort(); } } return result; } /// /// HTTP-POST方法(不包含body数据) /// /// 请求目标URL /// 令牌(凭证)[可选] /// 是否以二进制模式读取响应内容(默认:否,即表示以文本方式读取) /// HTTP-POST的响应结果 public HttpResult Post(string url, string token, bool binaryMode = false) { HttpResult result = new HttpResult(); HttpWebRequest wReq = null; try { wReq = WebRequest.Create(url) as HttpWebRequest; wReq.Method = "POST"; if (!string.IsNullOrEmpty(token)) { wReq.Headers.Add("Authorization", token); } wReq.UserAgent = userAgent; wReq.AllowAutoRedirect = allowAutoRedirect; wReq.ServicePoint.Expect100Continue = false; HttpWebResponse wResp = wReq.GetResponse() as HttpWebResponse; if (wResp != null) { result.Code = (int)wResp.StatusCode; result.RefCode = (int)wResp.StatusCode; getHeaders(ref result, wResp); if (binaryMode) { int len = (int)wResp.ContentLength; result.Data = new byte[len]; int bytesLeft = len; int bytesRead = 0; using (BinaryReader br = new BinaryReader(wResp.GetResponseStream())) { while (bytesLeft > 0) { bytesRead = br.Read(result.Data, len - bytesLeft, bytesLeft); bytesLeft -= bytesRead; } } } else { using (StreamReader sr = new StreamReader(wResp.GetResponseStream())) { result.Text = sr.ReadToEnd(); } } wResp.Close(); } } catch (WebException wex) { HttpWebResponse xResp = wex.Response as HttpWebResponse; if (xResp != null) { result.Code = (int)xResp.StatusCode; result.RefCode = (int)xResp.StatusCode; getHeaders(ref result, xResp); using (StreamReader sr = new StreamReader(xResp.GetResponseStream())) { result.Text = sr.ReadToEnd(); } xResp.Close(); } } catch (Exception ex) { StringBuilder sb = new StringBuilder(); sb.AppendFormat("[{0}] [{1}] [HTTP-POST] Error: ", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.ffff"),userAgent); Exception e = ex; while (e != null) { sb.Append(e.Message + " "); e = e.InnerException; } sb.AppendLine(); result.RefCode = (int)HttpCode.USER_UNDEF; result.RefText += sb.ToString(); } finally { if (wReq != null) { wReq.Abort(); } } return result; } /// /// HTTP-POST方法(包含body数据) /// /// 请求目标URL /// 主体数据(字节数据) /// 令牌(凭证)[可选->设置为null] /// 是否以二进制模式读取响应内容(默认:否,即表示以文本方式读取) /// HTTP-POST的响应结果 public HttpResult PostData(string url, byte[] data, string token, bool binaryMode = false) { HttpResult result = new HttpResult(); HttpWebRequest wReq = null; try { wReq = WebRequest.Create(url) as HttpWebRequest; wReq.Method = "POST"; if (!string.IsNullOrEmpty(token)) { wReq.Headers.Add("Authorization", token); } wReq.ContentType = ContentType.APPLICATION_OCTET_STREAM; wReq.UserAgent = userAgent; wReq.AllowAutoRedirect = allowAutoRedirect; wReq.ServicePoint.Expect100Continue = false; if (data != null) { wReq.AllowWriteStreamBuffering = true; using (Stream sReq = wReq.GetRequestStream()) { sReq.Write(data, 0, data.Length); sReq.Flush(); } } HttpWebResponse wResp = wReq.GetResponse() as HttpWebResponse; if (wResp != null) { result.Code = (int)wResp.StatusCode; result.RefCode = (int)wResp.StatusCode; getHeaders(ref result, wResp); if (binaryMode) { int len = (int)wResp.ContentLength; result.Data = new byte[len]; int bytesLeft = len; int bytesRead = 0; using (BinaryReader br = new BinaryReader(wResp.GetResponseStream())) { while (bytesLeft > 0) { bytesRead = br.Read(result.Data, len - bytesLeft, bytesLeft); bytesLeft -= bytesRead; } } } else { using (StreamReader sr = new StreamReader(wResp.GetResponseStream())) { result.Text = sr.ReadToEnd(); } } wResp.Close(); } } catch (WebException wex) { HttpWebResponse xResp = wex.Response as HttpWebResponse; if (xResp != null) { result.Code = (int)xResp.StatusCode; result.RefCode = (int)xResp.StatusCode; getHeaders(ref result, xResp); using (StreamReader sr = new StreamReader(xResp.GetResponseStream())) { result.Text = sr.ReadToEnd(); } xResp.Close(); } } catch (Exception ex) { StringBuilder sb = new StringBuilder(); sb.AppendFormat("[{0}] [{1}] [HTTP-POST-BIN] Error: ", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.ffff"),userAgent); Exception e = ex; while (e != null) { sb.Append(e.Message + " "); e = e.InnerException; } sb.AppendLine(); result.RefCode = (int)HttpCode.USER_UNDEF; result.RefText += sb.ToString(); } finally { if (wReq != null) { wReq.Abort(); } } return result; } /// /// HTTP-POST方法(包含body数据) /// /// 请求目标URL /// 主体数据(字节数据) /// 主体数据内容类型 /// 令牌(凭证)[可选] /// 是否以二进制模式读取响应内容(默认:否,即表示以文本方式读取) /// HTTP-POST的响应结果 public HttpResult PostData(string url, byte[] data, string mimeType, string token, bool binaryMode = false) { HttpResult result = new HttpResult(); HttpWebRequest wReq = null; try { wReq = WebRequest.Create(url) as HttpWebRequest; wReq.Method = "POST"; if (!string.IsNullOrEmpty(token)) { wReq.Headers.Add("Authorization", token); } wReq.ContentType = mimeType; wReq.UserAgent = userAgent; wReq.AllowAutoRedirect = allowAutoRedirect; wReq.ServicePoint.Expect100Continue = false; if (data != null) { wReq.AllowWriteStreamBuffering = true; using (Stream sReq = wReq.GetRequestStream()) { sReq.Write(data, 0, data.Length); sReq.Flush(); } } HttpWebResponse wResp = wReq.GetResponse() as HttpWebResponse; if (wResp != null) { result.Code = (int)wResp.StatusCode; result.RefCode = (int)wResp.StatusCode; getHeaders(ref result, wResp); if (binaryMode) { int len = (int)wResp.ContentLength; result.Data = new byte[len]; int bytesLeft = len; int bytesRead = 0; using (BinaryReader br = new BinaryReader(wResp.GetResponseStream())) { while (bytesLeft > 0) { bytesRead = br.Read(result.Data, len - bytesLeft, bytesLeft); bytesLeft -= bytesRead; } } } else { using (StreamReader sr = new StreamReader(wResp.GetResponseStream())) { result.Text = sr.ReadToEnd(); } } wResp.Close(); } } catch (WebException wex) { HttpWebResponse xResp = wex.Response as HttpWebResponse; if (xResp != null) { result.Code = (int)xResp.StatusCode; result.RefCode = (int)xResp.StatusCode; getHeaders(ref result, xResp); using (StreamReader sr = new StreamReader(xResp.GetResponseStream())) { result.Text = sr.ReadToEnd(); } xResp.Close(); } } catch (Exception ex) { StringBuilder sb = new StringBuilder(); sb.AppendFormat("[{0}] [{1}] [HTTP-POST-BIN] Error: ", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.ffff"),userAgent); Exception e = ex; while (e != null) { sb.Append(e.Message + " "); e = e.InnerException; } sb.AppendLine(); result.RefCode = (int)HttpCode.USER_UNDEF; result.RefText += sb.ToString(); } finally { if (wReq != null) { wReq.Abort(); } } return result; } /// /// HTTP-POST方法(包含JSON文本的body数据) /// /// 请求目标URL /// 主体数据(JSON文本) /// 令牌(凭证)[可选] /// 是否以二进制模式读取响应内容(默认:否,即表示以文本方式读取) /// HTTP-POST的响应结果 public HttpResult PostJson(string url, string data, string token, bool binaryMode = false) { HttpResult result = new HttpResult(); HttpWebRequest wReq = null; try { wReq = WebRequest.Create(url) as HttpWebRequest; wReq.Method = "POST"; if (!string.IsNullOrEmpty(token)) { wReq.Headers.Add("Authorization", token); } wReq.ContentType = ContentType.APPLICATION_JSON; wReq.UserAgent = userAgent; wReq.AllowAutoRedirect = allowAutoRedirect; wReq.ServicePoint.Expect100Continue = false; if (data != null) { var array = Encoding.UTF8.GetBytes(data); wReq.AllowWriteStreamBuffering = true; using (Stream sReq = wReq.GetRequestStream()) { sReq.Write(array , 0, array.Length); sReq.Flush(); } } HttpWebResponse wResp = wReq.GetResponse() as HttpWebResponse; if (wResp != null) { result.Code = (int)wResp.StatusCode; result.RefCode = (int)wResp.StatusCode; getHeaders(ref result, wResp); if (binaryMode) { int len = (int)wResp.ContentLength; result.Data = new byte[len]; int bytesLeft = len; int bytesRead = 0; using (BinaryReader br = new BinaryReader(wResp.GetResponseStream())) { while (bytesLeft > 0) { bytesRead = br.Read(result.Data, len - bytesLeft, bytesLeft); bytesLeft -= bytesRead; } } } else { using (StreamReader sr = new StreamReader(wResp.GetResponseStream())) { result.Text = sr.ReadToEnd(); } } wResp.Close(); } } catch (WebException wex) { HttpWebResponse xResp = wex.Response as HttpWebResponse; if (xResp != null) { result.Code = (int)xResp.StatusCode; result.RefCode = (int)xResp.StatusCode; getHeaders(ref result, xResp); using (StreamReader sr = new StreamReader(xResp.GetResponseStream())) { result.Text = sr.ReadToEnd(); } xResp.Close(); } } catch (Exception ex) { StringBuilder sb = new StringBuilder(); sb.AppendFormat("[{0}] [{1}] [HTTP-POST-JSON] Error: ", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.ffff"),userAgent); Exception e = ex; while (e != null) { sb.Append(e.Message + " "); e = e.InnerException; } sb.AppendLine(); result.RefCode = (int)HttpCode.USER_UNDEF; result.RefText += sb.ToString(); } finally { if (wReq != null) { wReq.Abort(); } } return result; } /// /// HTTP-POST方法(包含普通文本的body数据) /// /// 请求目标URL /// 主体数据(普通文本) /// 令牌(凭证)[可选->设置为null] /// 是否以二进制模式读取响应内容(默认:否,即表示以文本方式读取) /// HTTP-POST的响应结果 public HttpResult PostText(string url, string data, string token, bool binaryMode = false) { HttpResult result = new HttpResult(); HttpWebRequest wReq = null; try { wReq = WebRequest.Create(url) as HttpWebRequest; wReq.Method = "POST"; if (!string.IsNullOrEmpty(token)) { wReq.Headers.Add("Authorization", token); } wReq.ContentType = ContentType.TEXT_PLAIN; wReq.UserAgent = userAgent; wReq.AllowAutoRedirect = allowAutoRedirect; wReq.ServicePoint.Expect100Continue = false; if (data != null) { var array = Encoding.UTF8.GetBytes(data); wReq.AllowWriteStreamBuffering = true; using (Stream sReq = wReq.GetRequestStream()) { sReq.Write(array , 0, array.Length); sReq.Flush(); } } HttpWebResponse wResp = wReq.GetResponse() as HttpWebResponse; if (wResp != null) { result.Code = (int)wResp.StatusCode; result.RefCode = (int)wResp.StatusCode; getHeaders(ref result, wResp); if (binaryMode) { int len = (int)wResp.ContentLength; result.Data = new byte[len]; int bytesLeft = len; int bytesRead = 0; using (BinaryReader br = new BinaryReader(wResp.GetResponseStream())) { while (bytesLeft > 0) { bytesRead = br.Read(result.Data, len - bytesLeft, bytesLeft); bytesLeft -= bytesRead; } } } else { using (StreamReader sr = new StreamReader(wResp.GetResponseStream())) { result.Text = sr.ReadToEnd(); } } wResp.Close(); } } catch (WebException wex) { HttpWebResponse xResp = wex.Response as HttpWebResponse; if (xResp != null) { result.Code = (int)xResp.StatusCode; result.RefCode = (int)xResp.StatusCode; getHeaders(ref result, xResp); using (StreamReader sr = new StreamReader(xResp.GetResponseStream())) { result.Text = sr.ReadToEnd(); } xResp.Close(); } } catch (Exception ex) { StringBuilder sb = new StringBuilder(); sb.AppendFormat("[{0}] [{1}] [HTTP-POST-TEXT] Error: ", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.ffff"),userAgent); Exception e = ex; while (e != null) { sb.Append(e.Message + " "); e = e.InnerException; } sb.AppendLine(); result.RefCode = (int)HttpCode.USER_UNDEF; result.RefText += sb.ToString(); } finally { if (wReq != null) { wReq.Abort(); } } return result; } /// /// HTTP-POST方法(包含表单数据) /// /// 请求目标URL /// 键值对数据 /// 令牌(凭证)[可选->设置为null] /// 是否以二进制模式读取响应内容(默认:否,即表示以文本方式读取) /// HTTP-POST的响应结果 public HttpResult PostForm(string url, Dictionary kvData, string token, bool binaryMode = false) { HttpResult result = new HttpResult(); HttpWebRequest wReq = null; try { wReq = WebRequest.Create(url) as HttpWebRequest; wReq.Method = "POST"; if (!string.IsNullOrEmpty(token)) { wReq.Headers.Add("Authorization", token); } wReq.ContentType = ContentType.WWW_FORM_URLENC; wReq.UserAgent = userAgent; wReq.AllowAutoRedirect = allowAutoRedirect; wReq.ServicePoint.Expect100Continue = false; if (kvData != null) { StringBuilder sbb = new StringBuilder(); foreach (var kv in kvData) { sbb.AppendFormat("{0}={1}&", Uri.EscapeDataString(kv.Key), Uri.EscapeDataString(kv.Value)); } string data = sbb.ToString(); if(!string.IsNullOrEmpty(data) && data.Length > 1) { data = data.Substring(0 , data.Length - 1); } var array = Encoding.UTF8.GetBytes(data); wReq.AllowWriteStreamBuffering = true; using (Stream sReq = wReq.GetRequestStream()) { sReq.Write(array , 0, array.Length - 1); sReq.Flush(); } } HttpWebResponse wResp = wReq.GetResponse() as HttpWebResponse; if (wResp != null) { result.Code = (int)wResp.StatusCode; result.RefCode = (int)wResp.StatusCode; getHeaders(ref result, wResp); if (binaryMode) { int len = (int)wResp.ContentLength; result.Data = new byte[len]; int bytesLeft = len; int bytesRead = 0; using (BinaryReader br = new BinaryReader(wResp.GetResponseStream())) { while (bytesLeft > 0) { bytesRead = br.Read(result.Data, len - bytesLeft, bytesLeft); bytesLeft -= bytesRead; } } } else { using (StreamReader sr = new StreamReader(wResp.GetResponseStream())) { result.Text = sr.ReadToEnd(); } } wResp.Close(); } } catch (WebException wex) { HttpWebResponse xResp = wex.Response as HttpWebResponse; if (xResp != null) { result.Code = (int)xResp.StatusCode; result.RefCode = (int)xResp.StatusCode; getHeaders(ref result, xResp); using (StreamReader sr = new StreamReader(xResp.GetResponseStream())) { result.Text = sr.ReadToEnd(); } xResp.Close(); } } catch (Exception ex) { StringBuilder sb = new StringBuilder(); sb.AppendFormat("[{0}] [{1}] [HTTP-POST-FORM] Error: ", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.ffff"),userAgent); Exception e = ex; while (e != null) { sb.Append(e.Message + " "); e = e.InnerException; } sb.AppendLine(); result.RefCode = (int)HttpCode.USER_UNDEF; result.RefText += sb.ToString(); } finally { if (wReq != null) { wReq.Abort(); } } return result; } /// /// HTTP-POST方法(包含表单数据) /// /// 请求目标URL /// 表单数据 /// 令牌(凭证)[可选->设置为null] /// 是否以二进制模式读取响应内容(默认:否,即表示以文本方式读取) /// HTTP-POST的响应结果 public HttpResult PostForm(string url, string data, string token, bool binaryMode = false) { HttpResult result = new HttpResult(); HttpWebRequest wReq = null; try { wReq = WebRequest.Create(url) as HttpWebRequest; wReq.Method = "POST"; if (!string.IsNullOrEmpty(token)) { wReq.Headers.Add("Authorization", token); } wReq.ContentType = ContentType.WWW_FORM_URLENC; wReq.UserAgent = userAgent; wReq.AllowAutoRedirect = allowAutoRedirect; wReq.ServicePoint.Expect100Continue = false; if (!string.IsNullOrEmpty(data)) { var array = Encoding.UTF8.GetBytes(data); wReq.AllowWriteStreamBuffering = true; using (Stream sReq = wReq.GetRequestStream()) { sReq.Write(array , 0, array.Length); sReq.Flush(); } } HttpWebResponse wResp = wReq.GetResponse() as HttpWebResponse; if (wResp != null) { result.Code = (int)wResp.StatusCode; result.RefCode = (int)wResp.StatusCode; getHeaders(ref result, wResp); if (binaryMode) { int len = (int)wResp.ContentLength; result.Data = new byte[len]; int bytesLeft = len; int bytesRead = 0; using (BinaryReader br = new BinaryReader(wResp.GetResponseStream())) { while (bytesLeft > 0) { bytesRead = br.Read(result.Data, len - bytesLeft, bytesLeft); bytesLeft -= bytesRead; } } } else { using (StreamReader sr = new StreamReader(wResp.GetResponseStream())) { result.Text = sr.ReadToEnd(); } } wResp.Close(); } } catch (WebException wex) { HttpWebResponse xResp = wex.Response as HttpWebResponse; if (xResp != null) { result.Code = (int)xResp.StatusCode; result.RefCode = (int)xResp.StatusCode; getHeaders(ref result, xResp); using (StreamReader sr = new StreamReader(xResp.GetResponseStream())) { result.Text = sr.ReadToEnd(); } xResp.Close(); } } catch (Exception ex) { StringBuilder sb = new StringBuilder(); sb.AppendFormat("[{0}] [{1}] [HTTP-POST-FORM] Error: ", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.ffff"),userAgent); Exception e = ex; while (e != null) { sb.Append(e.Message + " "); e = e.InnerException; } sb.AppendLine(); result.RefCode = (int)HttpCode.USER_UNDEF; result.RefText += sb.ToString(); } finally { if (wReq != null) { wReq.Abort(); } } return result; } /// /// HTTP-POST方法(包含表单数据) /// /// 请求目标URL /// 表单数据 /// 令牌(凭证)[可选->设置为null] /// 是否以二进制模式读取响应内容(默认:否,即表示以文本方式读取) /// HTTP-POST的响应结果 public HttpResult PostForm(string url, byte[] data, string token, bool binaryMode = false) { HttpResult result = new HttpResult(); HttpWebRequest wReq = null; try { wReq = WebRequest.Create(url) as HttpWebRequest; wReq.Method = "POST"; if (!string.IsNullOrEmpty(token)) { wReq.Headers.Add("Authorization", token); } wReq.ContentType = ContentType.WWW_FORM_URLENC; wReq.UserAgent = userAgent; wReq.AllowAutoRedirect = allowAutoRedirect; wReq.ServicePoint.Expect100Continue = false; if (data != null) { wReq.AllowWriteStreamBuffering = true; using (Stream sReq = wReq.GetRequestStream()) { sReq.Write(data, 0, data.Length); sReq.Flush(); } } HttpWebResponse wResp = wReq.GetResponse() as HttpWebResponse; if (wResp != null) { result.Code = (int)wResp.StatusCode; result.RefCode = (int)wResp.StatusCode; getHeaders(ref result, wResp); if (binaryMode) { int len = (int)wResp.ContentLength; result.Data = new byte[len]; int bytesLeft = len; int bytesRead = 0; using (BinaryReader br = new BinaryReader(wResp.GetResponseStream())) { while (bytesLeft > 0) { bytesRead = br.Read(result.Data, len - bytesLeft, bytesLeft); bytesLeft -= bytesRead; } } } else { using (StreamReader sr = new StreamReader(wResp.GetResponseStream())) { result.Text = sr.ReadToEnd(); } } wResp.Close(); } } catch (WebException wex) { HttpWebResponse xResp = wex.Response as HttpWebResponse; if (xResp != null) { result.Code = (int)xResp.StatusCode; result.RefCode = (int)xResp.StatusCode; getHeaders(ref result, xResp); using (StreamReader sr = new StreamReader(xResp.GetResponseStream())) { result.Text = sr.ReadToEnd(); } xResp.Close(); } } catch (Exception ex) { StringBuilder sb = new StringBuilder(); sb.AppendFormat("[{0}] [{1}] [HTTP-POST-FORM] Error: ", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.ffff"),userAgent); Exception e = ex; while (e != null) { sb.Append(e.Message + " "); e = e.InnerException; } sb.AppendLine(); result.RefCode = (int)HttpCode.USER_UNDEF; result.RefText += sb.ToString(); } finally { if (wReq != null) { wReq.Abort(); } } return result; } /// /// HTTP-POST方法(包含多分部数据,multipart/form-data) /// /// 请求目标URL /// 主体数据 /// 分界标志 /// 令牌(凭证)[可选->设置为null] /// 是否以二进制模式读取响应内容(默认:否,即表示以文本方式读取) /// HTTP-POST的响应结果 public HttpResult PostMultipart(string url, byte[] data, string boundary, string token, bool binaryMode = false) { HttpResult result = new HttpResult(); HttpWebRequest wReq = null; try { wReq = WebRequest.Create(url) as HttpWebRequest; wReq.Method = "POST"; if (!string.IsNullOrEmpty(token)) { wReq.Headers.Add("Authorization", token); } wReq.ContentType = string.Format("{0}; boundary={1}", ContentType.MULTIPART_FORM_DATA, boundary); wReq.UserAgent = userAgent; wReq.AllowAutoRedirect = allowAutoRedirect; wReq.ServicePoint.Expect100Continue = false; wReq.AllowWriteStreamBuffering = true; using (Stream sReq = wReq.GetRequestStream()) { sReq.Write(data, 0, data.Length); sReq.Flush(); } HttpWebResponse wResp = wReq.GetResponse() as HttpWebResponse; if (wResp != null) { result.Code = (int)wResp.StatusCode; result.RefCode = (int)wResp.StatusCode; getHeaders(ref result, wResp); if (binaryMode) { int len = (int)wResp.ContentLength; result.Data = new byte[len]; int bytesLeft = len; int bytesRead = 0; using (BinaryReader br = new BinaryReader(wResp.GetResponseStream())) { while (bytesLeft > 0) { bytesRead = br.Read(result.Data, len - bytesLeft, bytesLeft); bytesLeft -= bytesRead; } } } else { using (StreamReader sr = new StreamReader(wResp.GetResponseStream())) { result.Text = sr.ReadToEnd(); } } wResp.Close(); } } catch (WebException wex) { HttpWebResponse xResp = wex.Response as HttpWebResponse; if (xResp != null) { result.Code = (int)xResp.StatusCode; result.RefCode = (int)xResp.StatusCode; getHeaders(ref result, xResp); using (StreamReader sr = new StreamReader(xResp.GetResponseStream())) { result.Text = sr.ReadToEnd(); } xResp.Close(); } } catch (Exception ex) { StringBuilder sb = new StringBuilder(); sb.AppendFormat("[{0}] [{1}] [HTTP-POST-MPART] Error: ", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.ffff"), userAgent); Exception e = ex; while (e != null) { sb.Append(e.Message + " "); e = e.InnerException; } sb.AppendLine(); result.RefCode = (int)HttpCode.USER_UNDEF; result.RefText += sb.ToString(); } finally { if (wReq != null) { wReq.Abort(); } } return result; } /// /// 获取返回信息头 /// /// 即将被HTTP请求封装函数返回的HttpResult变量 /// 正在被读取的HTTP响应 private void getHeaders(ref HttpResult hr, HttpWebResponse resp) { if (resp != null) { if (hr.RefInfo == null) { hr.RefInfo = new Dictionary(); } hr.RefInfo.Add("ProtocolVersion", resp.ProtocolVersion.ToString()); if (!string.IsNullOrEmpty(resp.CharacterSet)) { hr.RefInfo.Add("Characterset", resp.CharacterSet); } if (!string.IsNullOrEmpty(resp.ContentEncoding)) { hr.RefInfo.Add("ContentEncoding", resp.ContentEncoding); } if (!string.IsNullOrEmpty(resp.ContentType)) { hr.RefInfo.Add("ContentType", resp.ContentType); } hr.RefInfo.Add("ContentLength", resp.ContentLength.ToString()); var headers = resp.Headers; if (headers != null && headers.Count > 0) { if (hr.RefInfo == null) { hr.RefInfo = new Dictionary(); } foreach (var key in headers.AllKeys) { hr.RefInfo.Add(key, headers[key]); } } } } } }