HttpWebRequest 使用

1、创建请求

    /// <summary>
        /// 创建请求
        /// </summary>
        /// <param name="url">请求地址</param>
        /// <param name="httpway">请求方式</param>
        /// <param name="isformdata">是否表单</param>
        /// <param name="p12FileName">证书名</param>
        /// <param name="p12Password">证书密码</param>
        /// <param name="referer">推荐人</param>
        /// <returns></returns>
        private static HttpWebRequest BuildRequest(string url, string httpway, bool isformdata = false, string p12FileName = null, string p12Password = null, string referer = "")
        {
            //垃圾回收,回收没有正常关闭的http链接
            System.GC.Collect();
            //设置最大链接数
            System.Net.ServicePointManager.DefaultConnectionLimit = 200;

            ServicePointManager.ServerCertificateValidationCallback += RemoteCertificateValidate;
            if (url.StartsWith("https", StringComparison.OrdinalIgnoreCase))
            {
                ServicePointManager.SecurityProtocol = (SecurityProtocolType)3072;
            }

            HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);

            X509Certificate2 cerCaiShang = new X509Certificate2(p12FileName, p12Password);

            request.ClientCertificates.Add(cerCaiShang);
            request.CookieContainer = mycook;
            request.UserAgent = userAgent;
            request.Timeout = 10000;
            request.KeepAlive = true;
            request.AllowAutoRedirect = true;
            request.ServicePoint.Expect100Continue = false;
            request.AllowWriteStreamBuffering = false;
            request.Proxy = null;
            request.ServicePoint.ConnectionLimit = 65500;
            request.ServicePoint.UseNagleAlgorithm = false;

            if (!string.IsNullOrEmpty(referer))
            {
                request.Referer = referer;
            }
            request.Method = httpway;
            request.Accept = isformdata ? "*/*" : "text/html, application/xhtml+xml, */*";
            request.ContentType = isformdata ? "application/x-www-form-urlencoded;charset=UTF-8" : "application/json";
            return request;
        }

        /// <summary>
        /// 远程证书验证
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="cert"></param>
        /// <param name="chain"></param>
        /// <param name="error"></param>
        /// <returns></returns>
        private static bool RemoteCertificateValidate(object sender, X509Certificate cert, X509Chain chain, SslPolicyErrors error)
        {
            //为了通过证书验证,总是返回true
            return true;
        }

2、创建请求,并发送请求

 static readonly string baseUrl = ConfigurationManager.AppSettings["OcUrl"].ToString();//  "https://180.101.147.89:8743";

        private static CookieContainer mycook = new CookieContainer();
        // CSDBettingSystem.Tools.HttpHelper_s
        private static string userAgent = "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.104 Safari/537.36 Core/1.53.4882.400 QQBrowser/9.7.13059.400";



        /// <summary>
        /// GET
        /// </summary>
        /// <param name="url">请求地址</param>
        /// <param name="p12FileName">文件地址</param>
        /// <param name="p12Password">私有密钥</param>
        /// <param name="webheadercollection">请求协议头</param>
        /// <param name="referer">发起人</param>
        /// <returns></returns>
        public static ApiResult SendOcHttpRequestGet(string url, string p12FileName = null, string p12Password = null, WebHeaderCollection webheadercollection = null, string referer = "")
        {
            ServicePointManager.ServerCertificateValidationCallback += RemoteCertificateValidate;
            HttpWebRequest httpWebRequest = BuildRequest(baseUrl + url, "GET", false, p12FileName, p12Password, referer);
            if (webheadercollection != null)
            {
                for (int i = 0; i < webheadercollection.Count; i++)
                {
                    for (int j = 0; j < webheadercollection.GetValues(i).Length; j++)
                    {
                        httpWebRequest.Headers.Add(webheadercollection.Keys[i], webheadercollection.GetValues(i)[j]);
                    }
                }
            }
            httpWebRequest.Timeout = 10000;
            httpWebRequest.UserAgent = userAgent;
            return RecoverStringRequest(httpWebRequest);
        }

        /// <summary>
        /// Post
        /// </summary>
        /// <param name="url">请求地址</param>
        /// <param name="p12FileName">文件地址</param>
        /// <param name="p12Password">私有密钥</param>
        /// <param name="webheadercollection">请求协议头</param>
        /// <param name="referer">发起人</param>
        /// <returns></returns>
        public static ApiResult SendOcHttpRequestPost(string url, string postdata, string p12FileName = null, string p12Password = null, WebHeaderCollection webheadercollection = null, string referer = "")
        {
            if (url == null)
            {
                return null;
            }
            HttpWebRequest httpRequest = BuildRequest(baseUrl + url, "Post", false, p12FileName, p12Password, referer);
            //string postdata = string.Empty;
            if (webheadercollection != null)
            {
                for (int i = 0; i < webheadercollection.Count; i++)
                {
                    for (int j = 0; j < webheadercollection.GetValues(i).Length; j++)
                    {
                        httpRequest.Headers.Add(webheadercollection.Keys[i], webheadercollection.GetValues(i)[j]);
                    }
                }
            }
            Stream requestStream = null;
            if (!string.IsNullOrWhiteSpace(postdata))
            {
                byte[] data = Encoding.UTF8.GetBytes(postdata);
                httpRequest.ContentLength = data.Length;

                if (data != null)
                {
                    requestStream = httpRequest.GetRequestStream();
                    requestStream.Write(data, 0, data.Length);
                }


            }
            ApiResult result = RecoverStringRequest(httpRequest);
            if(requestStream != null)
            {
                /// 释放资源
                requestStream.Close();
            }
            return result;
        }

        /// <summary>
        /// PostForm
        /// </summary>
        /// <param name="url">请求地址</param>
        /// <param name="t">实体</param>
        /// <param name="p12FileName">文件地址</param>
        /// <param name="p12Password">私有密钥</param>
        /// <param name="webheadercollection">请求协议头</param>
        /// <param name="referer">发起人</param>
        /// <returns></returns>
        public static ApiResult SendOcHttpRequestPostForm<T>(string url, T t, string p12FileName = null, string p12Password = null, WebHeaderCollection webheadercollection = null, string referer = "")
        {
            if (url == null)
            {
                return null;
            }
            HttpWebRequest httpRequest = BuildRequest(baseUrl + url, "Post", true, p12FileName, p12Password, referer);
            string postdata = string.Empty;
            if (webheadercollection != null)
            {
                for (int i = 0; i < webheadercollection.Count; i++)
                {
                    for (int j = 0; j < webheadercollection.GetValues(i).Length; j++)
                    {
                        httpRequest.Headers.Add(webheadercollection.Keys[i], webheadercollection.GetValues(i)[j]);
                    }
                }
            }
            var type = typeof(T);
            var infos = type.GetProperties();
            StringBuilder stringBuilder = new StringBuilder();
            bool first = true;
            foreach (var item in infos)
            {
                stringBuilder.Append($"{(first ? "" : "&")}{item.Name}={item.GetValue(t)}");
                if (first)
                {
                    first = !first;
                }
            }
            postdata = stringBuilder.ToString();
            byte[] data = Encoding.UTF8.GetBytes(postdata);
            httpRequest.ContentLength = (long)data.Length;
            Stream requestStream = null;
            try
            {
                requestStream = httpRequest.GetRequestStream();
                requestStream.Write(data, 0, data.Length);
            }
            catch (Exception)
            {

            }
            if (requestStream == null)
            {
                return new ApiResult() { statusCode = 500, error = new Error { error_code = 500, error_desc = "写入请求数据失败" }, memo = "访问失败,但有错误报告" };
            }
            ApiResult result = RecoverStringRequest(httpRequest);

            if (requestStream != null)
            {
                /// 释放资源
                requestStream.Close();
            }
            return result;
        }

        /// <summary>
        /// PUT
        /// </summary>
        /// <param name="url">请求地址</param>
        /// <param name="putdata">传入对象</param>
        /// <param name="p12FileName">文件地址</param>
        /// <param name="p12Password">私有密钥</param>
        /// <param name="webheadercollection">请求协议头</param>
        /// <param name="referer">发起人</param>
        /// <returns></returns>
        public static ApiResult SendOcHttpRequestPut(string url, string putdata, string p12FileName = null, string p12Password = null, WebHeaderCollection webheadercollection = null, string referer = "")
        {
            if (url == null)
            {
                return null;
            }
            HttpWebRequest httpRequest = BuildRequest(baseUrl + url, "PUT", false, p12FileName, p12Password, referer);
            string postdata = putdata;
            if (webheadercollection != null)
            {
                for (int i = 0; i < webheadercollection.Count; i++)
                {
                    for (int j = 0; j < webheadercollection.GetValues(i).Length; j++)
                    {
                        httpRequest.Headers.Add(webheadercollection.Keys[i], webheadercollection.GetValues(i)[j]);
                    }
                }
            }
            if (!string.IsNullOrWhiteSpace(putdata))
            {
                byte[] data = Encoding.UTF8.GetBytes(postdata);
                httpRequest.ContentLength = (long)data.Length;
                Stream requestStream = httpRequest.GetRequestStream();
                if (requestStream != null)
                {
                    requestStream.Write(data, 0, data.Length);
                    ApiResult result = RecoverStringRequest(httpRequest);
                    if (requestStream != null)
                    {
                        /// 释放资源
                        requestStream.Close();
                    }
                    return result;
                }

            }

            return RecoverStringRequest(httpRequest);
        }

        /// <summary>
        /// DELETE
        /// </summary>
        /// <param name="url">请求地址</param>
        /// <param name="p12FileName">文件地址</param>
        /// <param name="p12Password">私有密钥</param>
        /// <param name="webheadercollection">请求协议头</param>
        /// <param name="referer">发起人</param>
        /// <returns></returns>
        public static ApiResult SendOcHttpRequestDelete(string url, string p12FileName = null, string p12Password = null, WebHeaderCollection webheadercollection = null, string referer = "")
        {
            if (url == null)
            {
                return null;
            }
            HttpWebRequest httpRequest = BuildRequest(baseUrl + url, "DELETE", false, p12FileName, p12Password, referer);
            if (webheadercollection != null)
            {
                for (int i = 0; i < webheadercollection.Count; i++)
                {
                    for (int j = 0; j < webheadercollection.GetValues(i).Length; j++)
                    {
                        httpRequest.Headers.Add(webheadercollection.Keys[i], webheadercollection.GetValues(i)[j]);
                    }
                }
            }
            return RecoverStringRequest(httpRequest);
        }

3、回收请求字符


        /// <summary>
        /// 回收字符请求
        /// </summary>
        /// <param name="httpWebRequest"></param>
        /// <returns></returns>
        private static ApiResult RecoverStringRequest(HttpWebRequest httpWebRequest)
        {
            ApiResult apiresult = null;
            try
            {
                using (HttpWebResponse httpResponse = (HttpWebResponse)httpWebRequest.GetResponse())
                {
                    Stream receiveStream = httpResponse.GetResponseStream();
                    string result = string.Empty;
                    using (StreamReader sr = new StreamReader(receiveStream, Encoding.UTF8))
                    {
                        result = sr.ReadToEnd();
                    }
                    if (result != null && result.Contains("error"))
                    {
                        apiresult = new ApiResult() { statusCode = (int)httpResponse.StatusCode, error = JsonConvert.DeserializeObject<Error>(result), memo = "访问成功,但有错误报告" };
                    }
                    else
                    {
                        apiresult = new ApiResult { statusCode = (int)httpResponse.StatusCode, result = result, memo = "访问成功" };
                    }
                    // 关闭流
                    //receiveStream.Close();
                    if (httpResponse != null)
                    {
                        httpResponse.Close();
                    }


                    return apiresult;
                }
            }
            catch (WebException ex)
            {

                apiresult = new ApiResult { statusCode = (int)ex.Status, error = new Error { error_code = (int)ex.Status, error_desc = ex.Message }, memo = ex.Message, NeedAnalysis = true };
                return apiresult;
            }
            finally
            {
                if (httpWebRequest != null)
                {
                    httpWebRequest.Abort();
                }
            }
        }

 

注意事项:Get请求不需要设置 httpRequest.ContentLength长度。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值