1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Threading.Tasks; 6 using System.Web; 7 using System.Net; 8 using System.IO; 9 using System.Security.Cryptography.X509Certificates; 10 using System.Security.Authentication; 11 using System.Net.Security; 12 13 namespace TravelB2B.Core.Utils 14 { 15 public class HttpClient 16 { 17 static log4net.ILog logger = log4net.LogManager.GetLogger("HttpClient"); 18 19 #region 一般数据请求 20 public static string WebRequest(Method method, string url, string postData) 21 { 22 return WebRequest(method, url, postData, Encoding.UTF8); 23 } 24
示例:
//string url = "https://www.baidu.com";
//string data = "client_id=21768513&client_secret=5568ab8e4f17b1a91bc732b289933f7d&grant_type=authorization_code&code=" + code + "&redirect_uri=http://www.juyingzhiye.com/TaoBao/ToTocketResult&state=1212&view=web";
//string res = TravelB2B.Core.Utils.HttpClient.WebRequest(Core.Utils.Method.POST, url, data);
static bool RemoteCertificateValidate(object sender, X509Certificate cert, X509Chain chain, SslPolicyErrors error) 26 { 28 return true; 29 } 30 31 public static string WebRequest(Method method, string url, string postData, Dictionary<string, dynamic> header) 32 { 33 return WebRequest(method, url, postData, Encoding.UTF8, header); 34 } 35 36 public static string WebRequest(Method method, string url, string postData, Encoding encoding) 37 { 38 return WebRequest(method, url, postData, encoding,null); 39 } 40 public static string WebRequest(Method method, string url, string postData, Encoding encoding,Dictionary<string,dynamic> header) 41 { 42 string responseData = ""; 43 HttpWebRequest webRequest = System.Net.WebRequest.Create(url) as HttpWebRequest; 44 webRequest.Method = method.ToString(); 45 webRequest.ServicePoint.Expect100Continue = false; 46 47 48 System.Text.RegularExpressions.Regex regex = new System.Text.RegularExpressions.Regex("^https://", System.Text.RegularExpressions.RegexOptions.IgnoreCase); 49 if (regex.IsMatch(url)) 50 { 51 ServicePointManager.ServerCertificateValidationCallback += RemoteCertificateValidate; 52 } 53 54 if (method == Method.POST || method == Method.PUT) 55 { 56 if (method == Method.POST) 57 { 58 webRequest.ContentType = "application/x-www-form-urlencoded;charset=utf-8"; 59 } 60 if (method == Method.PUT) 61 { 62 webRequest.ContentType = "html/xml"; 63 } 64 if (header != null) 65 { 66 foreach (var item in header) 67 { 68 if (item.Key == "Date") 69 { 70 webRequest.Date = DateTime.Parse(item.Value); 71 } 72 else if (item.Key == "ContentType") 73 { 74 webRequest.ContentType = item.Value; 75 } 76 else 77 { 78 webRequest.Headers[item.Key] = item.Value; 79 } 80 } 81 } 82 byte[] Bytes = encoding.GetBytes(postData); 83 webRequest.ContentLength = Bytes.Length; 84 85 using (Stream requestWriter = webRequest.GetRequestStream()) 86 { 87 try 88 { 89 requestWriter.Write(Bytes, 0, Bytes.Length); 90 } 91 catch 92 { 93 } 94 finally 95 { 96 requestWriter.Close(); 97 } 98 } 99 } 100 101 responseData = WebResponseGet(webRequest, encoding); 102 103 webRequest = null; 104 105 return responseData; 106 107 } 108 109 /// <summary> 110 /// 访问指定页面地址 111 /// </summary> 112 /// <param name="method"></param> 113 /// <param name="url"></param> 114 /// <param name="postData"></param> 115 /// <returns></returns> 116 public static string WebRequest(Method method, string url, IDictionary<string, string> parameters) 117 { 118 return WebRequest(method, url, ToQueryString(parameters)); 119 } 120 121 public static string WebRequest(Method method, string url, IDictionary<string, string> parameters,System.Text.Encoding encoding) 122 { 123 return WebRequest(method, url, ToQueryString(parameters), encoding); 124 } 125 例子:
//string url = "http://120.27.152.161/stardy/balance.jsp";
//Dictionary<string, string> para = new Dictionary<string, string>();
//para.Add("usr", UserName);
//para.Add("pwd", Password);
//return TravelB2B.Core.Utils.HttpClient.WebRequest(Utils.Method.POST, url, para, System.Text.Encoding.Default);
126 #endregion 127 128 #region 带有文字和图片的请求 129 /// <summary> 130 /// 带有文件/图片的请求 131 132 /// </summary> 133 /// <param name="method"></param> 134 /// <param name="url"></param> 135 /// <param name="postData"></param> 136 /// <returns></returns> 137 public static string WebRequest(Method method, string url, IDictionary<string, string> parameters, FileItem fileItem, Encoding encoding) 138 { 139 string responseData = ""; 140 HttpWebRequest webRequest = System.Net.WebRequest.Create(url) as HttpWebRequest; 141 webRequest.Method = method.ToString(); 142 webRequest.ServicePoint.Expect100Continue = false; 143 webRequest.KeepAlive = true; 144 webRequest.UserAgent = "Mozilla/5.0 (Windows; U; zh-CN)"; 145 146 string boundary = "---------------------------" + DateTime.Now.Ticks.ToString("x"); 147 148 if (method == Method.POST || method == Method.PUT) 149 { 150 webRequest.ContentType = "multipart/form-data; boundary=" + boundary; 151 152 using (Stream requestWriter = webRequest.GetRequestStream()) 153 { 154 try 155 { 156 StringBuilder sb = new StringBuilder(); 157 string start = "--" + boundary; 158 string end = start + "--"; 159 160 for (int i = 0; i < parameters.Count; i++) 161 { 162 sb.Append(start + "\r\n"); 163 sb.Append("Content-Disposition: form-data; name=\"" + parameters.ElementAt(i).Key + "\"\r\n\r\n"); 164 sb.Append(parameters.ElementAt(i).Value + "\r\n"); 165 } 166 sb.Append(start + "\r\n"); 167 sb.Append("Content-Disposition: form-data; name=\"" + fileItem.Name + "\"; filename=\"" + fileItem.FileName + "\"\r\n"); 168 sb.Append("Content-Type: " + fileItem.ContentType + "\r\n\r\n"); 169 string content = sb.ToString(); 170 requestWriter.Write(Encoding.UTF8.GetBytes(content), 0, content.Length); 171 requestWriter.Write(fileItem.Content, 0, fileItem.Content.Length); 172 string endContent = "\r\n" + end; 173 requestWriter.Write(Encoding.UTF8.GetBytes(endContent), 0, endContent.Length); 174 175 } 176 catch 177 { 178 throw; 179 } 180 finally 181 { 182 requestWriter.Close(); 183 } 184 } 185 } 186 187 responseData = WebResponseGet(webRequest, encoding); 188 189 webRequest = null; 190 191 return responseData; 192 } 193 194 #endregion 195 196 #region 获取返回数据 197 /// <summary> 198 /// 获取返回数据 199 /// </summary> 200 /// <param name="webRequest"></param> 201 /// <returns></returns> 202 private static string WebResponseGet(HttpWebRequest webRequest, System.Text.Encoding encoding) 203 { 204 HttpWebResponse res = null; 205 206 try 207 { 208 res = (HttpWebResponse)webRequest.GetResponse(); 209 } 210 catch (WebException ex) 211 { 212 logger.Error("返回异常:" + ex.ToString()); 213 res = (HttpWebResponse)ex.Response; 214 } 215 using (StreamReader responseReader = new StreamReader(res.GetResponseStream(), encoding)) 216 { 217 string responseData = responseReader.ReadToEnd(); 218 responseReader.Close(); 219 return responseData; 220 } 221 } 222 #endregion 223 224 #region 将字符串字典里的数据转换成URL查询字符串格式 225 226 /// <summary> 227 /// 将字符串字典里的数据转换成URL查询字符串格式。 228 /// </summary> 229 /// <param name="dict">字符串字典。</param> 230 /// <returns></returns> 231 public static string ToQueryString(IDictionary<string, string> dict) 232 { 233 if (dict == null) 234 return string.Empty; 235 236 if (dict.Count == 0) 237 return string.Empty; 238 239 var buffer = new StringBuilder(); 240 var count = 0; 241 var end = false; 242 243 foreach (var key in dict.Keys) 244 { 245 if (count == dict.Count - 1) end = true; 246 247 if (end) 248 buffer.AppendFormat("{0}={1}", key, dict[key]); 249 else 250 buffer.AppendFormat("{0}={1}&", key, dict[key]); 251 252 count++; 253 } 254 255 return buffer.ToString(); 256 } 257 258 #endregion 259 } 260 261 public enum Method { GET, POST, PUT, DELETE }; 262 263 #region 文件信息 264 public class FileItem 265 { 266 public string ContentType 267 { 268 get; 269 set; 270 } 271 272 public string Name 273 { 274 get; 275 set; 276 } 277 278 public string FileName 279 { 280 get; 281 set; 282 } 283 284 public byte[] Content 285 { 286 get; 287 set; 288 } 289 } 290 #endregion 291 }