HttpWebRequest,HttpWebResponse 使用

目的:工作中已经两次使用了,特此记录一下,并写好注释
    /// <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\n";
                string format = "protocolVersion:{0}\tstatusCode:{1}\tstatusDescription:{2}\n";
                errString += string.Format(format, exceptionRes.ProtocolVersion, Convert.ToInt32(exceptionRes.StatusCode), exceptionRes.StatusDescription);

                errString += "#Header\n";
                format = "num[{0}]:({1}:{2})\n";
                for (int i = 0; i < exceptionRes.Headers.Count; i++)
                {
                    errString += string.Format(format, i, exceptionRes.Headers.Keys[i], exceptionRes.Headers[i]);
                }

                errString += "#Body\n";
                using (Stream resStream = exceptionRes.GetResponseStream())
                {
                    using (StreamReader resStreamReader = new StreamReader(resStream, Encoding.GetEncoding(httpConfig.encoding)))
                    {
                        errString += resStreamReader.ReadToEnd() + "\n";
                        resStreamReader.Close();
                        resStream.Close();
                    }
                }
                errString += "#end\n";

                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;
        }
    }

  

posted @ 2017-04-17 15:35  翻白眼的哈士奇  阅读(685)  评论(0编辑  收藏  举报