目的:工作中已经两次使用了,特此记录一下,并写好注释
/// <summary> /// HttpWebRequest的基本配置 /// </summary> public class HttpConfig { /// <summary> /// 协议:http/https /// </summary> public string protocol { set; get; } /// <summary> /// 发送端发送的数据格式 /// </summary> public string contentType { set; get; } /// <summary> /// 客户端希望接受的数据类型 /// </summary> public string accept { set; get; } /// <summary> /// 标识请求者的一些信息,如浏览器类型和版本、操作系统,使用语言等信息(IE,Firefox以“Mozilla/....”开头) /// </summary> public string userAgent { set; get; } /// <summary> /// 超时时间 /// </summary> public int timeOut { set; get; } /// <summary> /// 请求body的编码类型:utf-8/gbk2312/gbk /// </summary> public string encoding { set; get; } /// <summary> /// 请求方式:GET/POST /// </summary> public string method { set; get; } /// <summary> /// 是否保持持续连接。默认为true /// </summary> public bool keepAlive { set; get; } /// <summary> /// cookie集合 /// </summary> public CookieContainer cc = null; /// <summary> /// http header集合 /// </summary> public WebHeaderCollection whc = null; public HttpConfig() { protocol = "http"; contentType = "application/xml;charset=utf-8"; accept = "application/xml"; userAgent = "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; .NET CLR 2.0.50727; .NET CLR 3.0.04506.648; .NET CLR 3.5.21022)"; timeOut = 15; encoding = "utf-8"; method = "POST"; keepAlive = false; } public HttpConfig(Dictionary<string, string> dctCookieKeyValus, string Domain, Dictionary<string, string> dctHeaderKeyValus) : this() { GetCookieContainer(dctCookieKeyValus, Domain); GetWebHeaderCollection(dctHeaderKeyValus); } /// <summary> /// 设置cookies /// </summary> /// <param name="dctKeyValus"></param> /// <param name="Domain"></param> public void GetCookieContainer(Dictionary<string, string> dctKeyValus, string Domain) { if (dctKeyValus.Count > 0) { cc = new CookieContainer(); foreach (string key in dctKeyValus.Keys) { Cookie cookie = new Cookie(key, dctKeyValus[key]); cookie.Domain = ""; cc.Add(cookie); } } } /// <summary> /// 设置httpheaders /// </summary> /// <param name="dctKeyValus"></param> public void GetWebHeaderCollection(Dictionary<string, string> dctKeyValus) { if (dctKeyValus.Count > 0) { whc = new WebHeaderCollection(); foreach (string key in dctKeyValus.Keys) { whc.Add(string.Format("{0}:{1}", key, dctKeyValus[key])); } } } } public class HttpRequestAndResponse { HttpConfig httpConfig = null; public HttpRequestAndResponse(HttpConfig httpconfig) { httpConfig = httpconfig; } /// <summary> /// 调过https验证 /// </summary> private static bool CheckValidationResult(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors errors) { return true; } public string RequestAndResponse(string url, string requestXML, ref string errString) { string response = ""; HttpWebRequest req = null; HttpWebResponse res = null; try { ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback(CheckValidationResult); /*最大并接数*************************************************************/ ServicePointManager.DefaultConnectionLimit = 200;//最大并发连接数 //如果写在配置文件里 app.config // <system.net> // <connectionManagement> // <!--表示把对任何域名的请求最大http连接数都设置为200--> // <add address = "*" maxconnection = "200" /> // </connectionManagement> //</system.net> req = WebRequest.Create(url) as HttpWebRequest; /*HttpWebRequest的基本属性设置*************************************************************/ req.ProtocolVersion = HttpVersion.Version10; req.UserAgent = httpConfig.userAgent; req.KeepAlive = httpConfig.keepAlive; req.Timeout = 1000 * httpConfig.timeOut; req.Method = httpConfig.method; req.Accept = httpConfig.accept; req.ContentType = httpConfig.contentType; /*写入http头部信息*************************************************************************/ if (httpConfig.whc != null) req.Headers = httpConfig.whc; /*cookie拼接*************************************************************/ if (httpConfig.cc != null) req.CookieContainer = httpConfig.cc; /*写入requestXML***************************************************************************/ if (!string.IsNullOrEmpty(requestXML)) { byte[] bytes = System.Text.Encoding.GetEncoding(httpConfig.encoding).GetBytes(requestXML); if (bytes.Length > 0) { req.ContentLength = bytes.Length; using (Stream reqStream = req.GetRequestStream()) { reqStream.Write(bytes, 0, bytes.Length); reqStream.Close(); } } } /*HttpWebResponse获取服务器数据**************************************************************/ res = req.GetResponse() as HttpWebResponse; using (Stream resStream = res.GetResponseStream()) { using (StreamReader resStreamReader = new StreamReader(resStream, Encoding.GetEncoding(httpConfig.encoding))) { response = resStreamReader.ReadToEnd(); } } } catch (WebException e) { HttpWebResponse exceptionRes = e.Response as HttpWebResponse; errString = "#Status-line "; string format = "protocolVersion:{0} statusCode:{1} statusDescription:{2} "; errString += string.Format(format, exceptionRes.ProtocolVersion, Convert.ToInt32(exceptionRes.StatusCode), exceptionRes.StatusDescription); errString += "#Header "; format = "num[{0}]:({1}:{2}) "; for (int i = 0; i < exceptionRes.Headers.Count; i++) { errString += string.Format(format, i, exceptionRes.Headers.Keys[i], exceptionRes.Headers[i]); } errString += "#Body "; using (Stream resStream = exceptionRes.GetResponseStream()) { using (StreamReader resStreamReader = new StreamReader(resStream, Encoding.GetEncoding(httpConfig.encoding))) { errString += resStreamReader.ReadToEnd() + " "; resStreamReader.Close(); resStream.Close(); } } errString += "#end "; exceptionRes.Close(); } catch (Exception e) { errString = e.ToString(); } finally { if (res!= null) { res.Close(); res = null; } if (req != null) { req.Abort(); req = null; } } return response; } }