C# Post

  1 /// <param name="para_postDataByte">字节集提交, 欲提交的字节集数据</param>
  2             /// <param name="para_method">访问方式, 0=GET 1=POST 2=HEAD 3=PUT  4=OPTIONS  5=DELETE  6=TRACE  7=CONNECT</param>
  3             /// <param name="para_postData">字符串信息提交, "POST"专用,方法内部自动将字符串进行UTF8编码</param>
  4             /// <param name="para_requestCookies">提交Cookies, 设置提交时的cookie</param>
  5             /// <param name="para_responseCookies">返回Cookies, 返回的Cookie</param>
  6             /// <param name="para_requestHeader">附加协议头, 一行一个请用换行符隔开</param>
  7             /// <param name="para_responseHeader">返回协议头, 访问网页时返回的协议头</param>
  8             /// <param name="para_responseStatusCode">返回状态代码, 访问网页时返回的状态代码,例如:200;302;404等</param>
  9             /// <param name="para_forbidDirect">禁止重定向, 默认不禁止网页重定向</param>
 10             /// <param name="para_proxyAdd">代{过}{滤}理地址, 格式为 8.8.8.8:88</param>
 11             /// <param name="para_timeout">网页访问超时, 单位:毫秒,默认为15000毫秒, -1为无限等待</param>
 12             /// <param name="para_proxyUser">代{过}{滤}理用户名</param>
 13             /// <param name="para_proxyPassw">代{过}{滤}理密码</param>
 14             /// <param name="para_proxyMark">代{过}{滤}理标识,默认为1,0为路由器</param>
 15             /// <param name="para_isUpdateCookies">是否自动合并更新Cookie, 默认为真,自动合并更新</param>
 16             /// <param name="isSupplyHeader">是否补全必要协议头,当附件协议头为空时自动添加必要的UA协议头 默认为真,假将不再添加非传入协议头</param>
 17             /// <param name="isResolveHeaderUandL">是否处理协议头大小写,将协议头中的键名首字母处理为大写  默认为真</param>
 18 public byte[] WebBrowse_winhttp(string para_url, byte[] para_postDataByte, int para_method = 0, string para_postData = "", string para_requestCookies = "", string para_responseCookies = "", string para_requestHeader = "", string para_responseHeader = "", int para_responseStatusCode = 200, bool para_forbidDirect = false, string para_proxyAdd = "", int para_timeout = 15000, string para_proxyUser = "", string para_proxyPassw = "", int para_proxyMark = 1, bool para_isUpdateCookies = true, bool isSupplyHeader = true, bool isResolveHeaderUandL = true)
 19             {
 20                  
 21                 if (para_method < 0 || para_method > 7) { para_method = 0; }
 22                 string[] browseMethodArr = new string[] { "GET", "POST", "HEAD", "PUT", "OPTIONS", "DELETE", "TRACE", "CONNECT" };
 23                 string browseMethod = browseMethodArr[para_method];
 24                 WinHttpRequest winhttpReq = new WinHttpRequest();//创建WinHttpRequest
 25                  
 26                 if (para_timeout != -1)//超时设置
 27                 {
 28                     if (para_timeout < 1) { para_timeout = 15000; }
 29                 }
 30                 winhttpReq.SetTimeouts(para_timeout, para_timeout, para_timeout, para_timeout);
 31  
 32                 if (para_proxyAdd != "")//代{过}{滤}理设置
 33                 {
 34                     winhttpReq.SetProxy(2, para_proxyAdd);
 35                 }
 36                 winhttpReq.Open(browseMethodArr[para_method], para_url, false);//winhttpReq.Open("请求方式","请求地址",是否异步请求)
 37  
 38                 if (para_forbidDirect)//是否禁止重定向
 39                 {
 40                     winhttpReq.Option[WinHttpRequestOption.WinHttpRequestOption_EnableRedirects] = 0;
 41                 }
 42                 winhttpReq.Option[WinHttpRequestOption.WinHttpRequestOption_SslErrorIgnoreFlags] = 13056;//忽略错误标志
 43  
 44                 if (isSupplyHeader)//是否补全必要协议头,当附件协议头为空时自动添加必要的UA协议头 默认为真
 45                 {
 46                     if (para_requestHeader.IndexOf("Accept:") == -1) { para_requestHeader += "
Accept: */*"; }
 47                     if (para_requestHeader.IndexOf("Referer:") == -1) { para_requestHeader += "
Referer: " + para_url; }
 48                     if (para_requestHeader.IndexOf("Accept-Language:") == -1) { para_requestHeader += "
Accept-Language: zh-cn"; }
 49                     if (para_requestHeader.IndexOf("User-Agent:") == -1) { para_requestHeader += "
User-Agent: Mozilla/4.0 (compatible; MSIE 9.0; Windows NT 6.1)"; }
 50                     if (para_method == 1)
 51                     {
 52                         if (para_requestHeader.IndexOf("Content-Type:") == -1) { para_requestHeader += "
Content-Type: application/x-www-form-urlencoded"; }
 53                     }
 54                 }
 55  
 56                 if (para_proxyAdd != "" && para_proxyUser != "")
 57                 {
 58                     winhttpReq.SetCredentials(para_proxyUser, para_proxyPassw, para_proxyMark);
 59                     if (para_proxyMark == 1) { winhttpReq.SetRequestHeader("Proxy-Authorization", "Basic " + TextOperate.EncodeAndDecode.EncodeBase64("gbk", para_proxyUser + ":" + para_proxyPassw)); }
 60                 }
 61  
 62                 if (para_requestCookies != null && para_requestCookies.Length > 0)
 63                 {
 64                     if (para_requestCookies.IndexOf("Cookie:", StringComparison.OrdinalIgnoreCase) != -1) {
 65                         para_requestCookies = TextOperate.TextUniversallyOperate.StrReplace(para_requestCookies, "Cookie:","");
 66                     }
 67                     winhttpReq.SetRequestHeader("Cookie", para_requestCookies);
 68                 }
 69                  
 70                 if (para_requestHeader.IndexOf("
") == -1)
 71                 {
 72                     Dictionary<string, string> headerInfo = GetNameAndValueFromeRequestHeader(para_requestHeader);
 73                     winhttpReq.SetRequestHeader(headerInfo["headerName"], headerInfo["headerValue"]);
 74                 }
 75                 else
 76                 {
 77                     string[] headerArr = para_requestHeader.Split(new string[] { "
" }, StringSplitOptions.RemoveEmptyEntries);
 78                     foreach (string headerArrItem in headerArr)
 79                     {
 80                         Dictionary<string, string> headerInfo = GetNameAndValueFromeRequestHeader(headerArrItem);
 81                         if (headerInfo["headerName"] == "Connection" && headerInfo["headerValue"] == "keep-alive") { continue; }//筛选排除此参数 避免协议头有此参数 HTTP对象又自动添加此参数
 82                         winhttpReq.SetRequestHeader(headerInfo["headerName"], headerInfo["headerValue"]);
 83                     }
 84                 }
 85  
 86                 if (para_postDataByte == null || para_postDataByte.Length == 0)
 87                 {
 88                     winhttpReq.Send(para_postData);//发送
 89                 }
 90                 else
 91                 {
 92                     winhttpReq.Send(para_postDataByte);//发送
 93                 }
 94                 byte[] responseBody_b = winhttpReq.ResponseBody;//返回的数据 用byte数组接收   注:winhttpReq.ResponseText直接输出有中文乱码的情况
 95                 //string docHtml = System.Text.Encoding.UTF8.GetString(responseBody_b);//转码
 96                 para_responseHeader = winhttpReq.GetAllResponseHeaders();
 97                 para_responseStatusCode = winhttpReq.Status;
 98  
 99                 string[] responseHeaderArr = para_responseHeader.Split(new string[] { "
" }, StringSplitOptions.RemoveEmptyEntries);
100                 para_responseCookies = "";
101                 foreach (string responseHeaderArrItem in responseHeaderArr)//取返回的cookie
102                 {
103                     if (TextOperate.TextUniversallyOperate.GetLeftStrByTargetStr(responseHeaderArrItem, ": ") == "Set-Cookie")
104                     {
105                         if (responseHeaderArrItem.IndexOf(";") != -1)
106                         {
107                             para_responseCookies += TextOperate.TextUniversallyOperate.GetMidStr(responseHeaderArrItem, "Set-Cookie:", ";").Trim() + ";";
108                         }
109                         else
110                         {
111                             para_responseCookies += TextOperate.TextUniversallyOperate.StrReplace(responseHeaderArrItem, "Set-Cookie:", "").Trim() + ";";
112                         }
113                     }
114                 }
115                 if (para_responseCookies.Length >= 2 && para_responseCookies.Substring(para_responseCookies.Length - 2) == "; ")
116                 {
117                     para_responseCookies = para_responseCookies.Substring(0, para_responseCookies.Length - 2);
118                 }
119                 if (para_isUpdateCookies)
120                 {
121                     if (para_requestCookies != null && para_requestCookies.Length != 0) { para_responseCookies = UpdateCookies(para_requestCookies, para_responseCookies); }
122                 }
123                 //Console.WriteLine(winhttpReq.GetAllResponseHeaders());
124                 return responseBody_b;
125             }
原文地址:https://www.cnblogs.com/DoNetCShap/p/13225572.html