C# HttpHelper帮助类,真正的Httprequest请求时无视编码,无视证书,无视Cookie,网页抓取...
生活随笔
收集整理的這篇文章主要介紹了
C# HttpHelper帮助类,真正的Httprequest请求时无视编码,无视证书,无视Cookie,网页抓取...
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
//取當前webBrowser登錄后的Cookie值
????????[DllImport("wininet.dll",?CharSet?=?CharSet.Auto,?SetLastError?=?true)]
????????static?extern?bool?InternetGetCookieEx(string?pchURL,?string?pchCookieName,?StringBuilder?pchCookieData,?ref?int?pcchCookieData,?int?dwFlags,?object?lpReserved);
????????//取出Cookie,當登錄后才能取
????????private?static?string?GetCookieString(string?url)
????????{
????????????//?Determine?the?size?of?the?cookie?????
????????????int?datasize?=?256;
????????????StringBuilder?cookieData?=?new?StringBuilder(datasize);
????????????if?(!InternetGetCookieEx(url,?null,?cookieData,?ref?datasize,?0x00002000,?null))
????????????{
????????????????if?(datasize?<?0)
????????????????????return?null;
????????????????//?Allocate?stringbuilder?large?enough?to?hold?the?cookie?????
????????????????cookieData?=?new?StringBuilder(datasize);
????????????????if?(!InternetGetCookieEx(url,?null,?cookieData,?ref?datasize,?0x00002000,?null))
????????????????????return?null;
????????????}
????????????return?cookieData.ToString();
????????}之前我寫過篇關于C#?HttpWebRequest?絕技的文章?無視證書的方法請在篇文章里面查找謝謝,以下不做無視證書的方法
無論是Get還是Post?帶Cookie,編碼問題解決?,這里完全做到了無視編碼的問題
最近把上面的方法整理了一下,這個類相當于一個SqlHelper類一下,我把它叫做HttpHelper類,以后還會慢慢更新,希望大家多我支持,
給大家分享一下吧,不好的地方感謝大家留言指正,不多說了上代碼吧!
///?<summary>
///?類說明:HttpHelps類,用來實現Http訪問,Post或者Get方式的,直接訪問,帶Cookie的,帶證書的等方式
///?編碼日期:2011-08-20
///?</summary>
using?System;
using?System.Collections.Generic;
using?System.Linq;
using?System.Text;
using?System.Net;
using?System.IO;
using?System.Text.RegularExpressions;
using?System.IO.Compression;
public?class?HttpHelps
{
????#region?預定義方法或者變更
????//默認的編碼
????private?Encoding?encoding?=?Encoding.Default;
????//HttpWebRequest對象用來發起請求
????private?HttpWebRequest?request?=?null;
????//獲取影響流的數據對象
????private?HttpWebResponse?response?=?null;
????//讀取流的對象
????private?StreamReader?reader?=?null;
????//需要返回的數據對象
????private?string?returnData?=?"String?Error";
????///?<summary>
????///?根據相傳入的數據,得到相應頁面數據
????///?</summary>
????///?<param?name="strPostdata">傳入的數據Post方式,get方式傳NUll或者空字符串都可以</param>
????///?<returns>string類型的響應數據</returns>
????private?string?GetHttpRequestData(string?strPostdata)
????{
????????try
????????{
????????????//支持跳轉頁面,查詢結果將是跳轉后的頁面
????????????request.AllowAutoRedirect?=?true;
????????????//驗證在得到結果時是否有傳入數據
????????????if?(!string.IsNullOrEmpty(strPostdata)?&&?request.Method.Trim().ToLower().Contains("post"))
????????????{
????????????????byte[]?buffer?=?encoding.GetBytes(strPostdata);
????????????????request.ContentLength?=?buffer.Length;
????????????????request.GetRequestStream().Write(buffer,?0,?buffer.Length);
????????????}
????????????#region?得到請求的response
????????????using?(response?=?(HttpWebResponse)request.GetResponse())
????????????{
????????????????//從這里開始我們要無視編碼了
????????????????if?(encoding?==?null)
????????????????{
????????????????????MemoryStream?_stream?=?new?MemoryStream();
????????????????????if?(response.ContentEncoding?!=?null?&&?response.ContentEncoding.Equals("gzip",?StringComparison.InvariantCultureIgnoreCase))
????????????????????{
????????????????????????//開始讀取流并設置編碼方式
????????????????????????new?GZipStream(response.GetResponseStream(),?CompressionMode.Decompress).CopyTo(_stream,?10240);
????????????????????}
????????????????????else
????????????????????{
????????????????????????response.GetResponseStream().CopyTo(_stream,?10240);
????????????????????}
????????????????????byte[]?RawResponse?=?_stream.ToArray();
????????????????????string?temp?=?Encoding.Default.GetString(RawResponse,?0,?RawResponse.Length);
????????????????????//<meta(.*?)charset([\s]?)=[^>](.*?)>
????????????????????Match?meta?=?Regex.Match(temp,?"<meta([^<]*)charset=([^<]*)[\"']",?RegexOptions.IgnoreCase?|?RegexOptions.Multiline);
????????????????????string?charter?=?(meta.Groups.Count?>?2)???meta.Groups[2].Value?:?string.Empty;
????????????????????charter?=?charter.Replace("\"",?string.Empty).Replace("'",?string.Empty).Replace(";",?string.Empty);
????????????????????if?(charter.Length?>?0)
????????????????????{
????????????????????????encoding?=?Encoding.GetEncoding(charter);
????????????????????}
????????????????????else
????????????????????{
????????????????????????if?(response.CharacterSet.ToLower().Trim()?==?"iso-8859-1")
????????????????????????{
????????????????????????????encoding?=?Encoding.GetEncoding("gbk");
????????????????????????}
????????????????????????else
????????????????????????{
????????????????????????????if?(string.IsNullOrEmpty(response.CharacterSet.Trim()))
????????????????????????????{
????????????????????????????????encoding?=?Encoding.UTF8;
????????????????????????????}
????????????????????????????else
????????????????????????????{
encoding?=?Encoding.GetEncoding(response.CharacterSet);
????????????????????????????}
????????????????????????}
????????????????????}
????????????????????returnData?=?encoding.GetString(RawResponse);
????????????????}
????????????????else
????????????????{
????????????????????if?(response.ContentEncoding?!=?null?&&?response.ContentEncoding.Equals("gzip",?StringComparison.InvariantCultureIgnoreCase))
????????????????????{
????????????????????????//開始讀取流并設置編碼方式
????????????????????????using?(reader?=?new?StreamReader(new?GZipStream(response.GetResponseStream(),?CompressionMode.Decompress),?encoding))
????????????????????????{
????????????????????????????returnData?=?reader.ReadToEnd();
????????????????????????}
????????????????????}
????????????????????else
????????????????????{
????????????????????????//開始讀取流并設置編碼方式
????????????????????????using?(reader?=?new?StreamReader(response.GetResponseStream(),?encoding))
????????????????????????{
????????????????????????????returnData?=?reader.ReadToEnd();
????????????????????????}
????????????????????}
????????????????}
????????????}
????????????#endregion
????????}
????????catch?(Exception)
????????{
????????????//這里是在發生異常時返回的錯誤信息
????????????returnData?=?"String?Error";
????????}
????????return?returnData.ToLower();
????}
????????[DllImport("wininet.dll",?CharSet?=?CharSet.Auto,?SetLastError?=?true)]
????????static?extern?bool?InternetGetCookieEx(string?pchURL,?string?pchCookieName,?StringBuilder?pchCookieData,?ref?int?pcchCookieData,?int?dwFlags,?object?lpReserved);
????????//取出Cookie,當登錄后才能取
????????private?static?string?GetCookieString(string?url)
????????{
????????????//?Determine?the?size?of?the?cookie?????
????????????int?datasize?=?256;
????????????StringBuilder?cookieData?=?new?StringBuilder(datasize);
????????????if?(!InternetGetCookieEx(url,?null,?cookieData,?ref?datasize,?0x00002000,?null))
????????????{
????????????????if?(datasize?<?0)
????????????????????return?null;
????????????????//?Allocate?stringbuilder?large?enough?to?hold?the?cookie?????
????????????????cookieData?=?new?StringBuilder(datasize);
????????????????if?(!InternetGetCookieEx(url,?null,?cookieData,?ref?datasize,?0x00002000,?null))
????????????????????return?null;
????????????}
????????????return?cookieData.ToString();
????????}之前我寫過篇關于C#?HttpWebRequest?絕技的文章?無視證書的方法請在篇文章里面查找謝謝,以下不做無視證書的方法
無論是Get還是Post?帶Cookie,編碼問題解決?,這里完全做到了無視編碼的問題
最近把上面的方法整理了一下,這個類相當于一個SqlHelper類一下,我把它叫做HttpHelper類,以后還會慢慢更新,希望大家多我支持,
給大家分享一下吧,不好的地方感謝大家留言指正,不多說了上代碼吧!
///?<summary>
///?類說明:HttpHelps類,用來實現Http訪問,Post或者Get方式的,直接訪問,帶Cookie的,帶證書的等方式
///?編碼日期:2011-08-20
///?</summary>
using?System;
using?System.Collections.Generic;
using?System.Linq;
using?System.Text;
using?System.Net;
using?System.IO;
using?System.Text.RegularExpressions;
using?System.IO.Compression;
public?class?HttpHelps
{
????#region?預定義方法或者變更
????//默認的編碼
????private?Encoding?encoding?=?Encoding.Default;
????//HttpWebRequest對象用來發起請求
????private?HttpWebRequest?request?=?null;
????//獲取影響流的數據對象
????private?HttpWebResponse?response?=?null;
????//讀取流的對象
????private?StreamReader?reader?=?null;
????//需要返回的數據對象
????private?string?returnData?=?"String?Error";
????///?<summary>
????///?根據相傳入的數據,得到相應頁面數據
????///?</summary>
????///?<param?name="strPostdata">傳入的數據Post方式,get方式傳NUll或者空字符串都可以</param>
????///?<returns>string類型的響應數據</returns>
????private?string?GetHttpRequestData(string?strPostdata)
????{
????????try
????????{
????????????//支持跳轉頁面,查詢結果將是跳轉后的頁面
????????????request.AllowAutoRedirect?=?true;
????????????//驗證在得到結果時是否有傳入數據
????????????if?(!string.IsNullOrEmpty(strPostdata)?&&?request.Method.Trim().ToLower().Contains("post"))
????????????{
????????????????byte[]?buffer?=?encoding.GetBytes(strPostdata);
????????????????request.ContentLength?=?buffer.Length;
????????????????request.GetRequestStream().Write(buffer,?0,?buffer.Length);
????????????}
????????????#region?得到請求的response
????????????using?(response?=?(HttpWebResponse)request.GetResponse())
????????????{
????????????????//從這里開始我們要無視編碼了
????????????????if?(encoding?==?null)
????????????????{
????????????????????MemoryStream?_stream?=?new?MemoryStream();
????????????????????if?(response.ContentEncoding?!=?null?&&?response.ContentEncoding.Equals("gzip",?StringComparison.InvariantCultureIgnoreCase))
????????????????????{
????????????????????????//開始讀取流并設置編碼方式
????????????????????????new?GZipStream(response.GetResponseStream(),?CompressionMode.Decompress).CopyTo(_stream,?10240);
????????????????????}
????????????????????else
????????????????????{
????????????????????????response.GetResponseStream().CopyTo(_stream,?10240);
????????????????????}
????????????????????byte[]?RawResponse?=?_stream.ToArray();
????????????????????string?temp?=?Encoding.Default.GetString(RawResponse,?0,?RawResponse.Length);
????????????????????//<meta(.*?)charset([\s]?)=[^>](.*?)>
????????????????????Match?meta?=?Regex.Match(temp,?"<meta([^<]*)charset=([^<]*)[\"']",?RegexOptions.IgnoreCase?|?RegexOptions.Multiline);
????????????????????string?charter?=?(meta.Groups.Count?>?2)???meta.Groups[2].Value?:?string.Empty;
????????????????????charter?=?charter.Replace("\"",?string.Empty).Replace("'",?string.Empty).Replace(";",?string.Empty);
????????????????????if?(charter.Length?>?0)
????????????????????{
????????????????????????encoding?=?Encoding.GetEncoding(charter);
????????????????????}
????????????????????else
????????????????????{
????????????????????????if?(response.CharacterSet.ToLower().Trim()?==?"iso-8859-1")
????????????????????????{
????????????????????????????encoding?=?Encoding.GetEncoding("gbk");
????????????????????????}
????????????????????????else
????????????????????????{
????????????????????????????if?(string.IsNullOrEmpty(response.CharacterSet.Trim()))
????????????????????????????{
????????????????????????????????encoding?=?Encoding.UTF8;
????????????????????????????}
????????????????????????????else
????????????????????????????{
encoding?=?Encoding.GetEncoding(response.CharacterSet);
????????????????????????????}
????????????????????????}
????????????????????}
????????????????????returnData?=?encoding.GetString(RawResponse);
????????????????}
????????????????else
????????????????{
????????????????????if?(response.ContentEncoding?!=?null?&&?response.ContentEncoding.Equals("gzip",?StringComparison.InvariantCultureIgnoreCase))
????????????????????{
????????????????????????//開始讀取流并設置編碼方式
????????????????????????using?(reader?=?new?StreamReader(new?GZipStream(response.GetResponseStream(),?CompressionMode.Decompress),?encoding))
????????????????????????{
????????????????????????????returnData?=?reader.ReadToEnd();
????????????????????????}
????????????????????}
????????????????????else
????????????????????{
????????????????????????//開始讀取流并設置編碼方式
????????????????????????using?(reader?=?new?StreamReader(response.GetResponseStream(),?encoding))
????????????????????????{
????????????????????????????returnData?=?reader.ReadToEnd();
????????????????????????}
????????????????????}
????????????????}
????????????}
????????????#endregion
????????}
????????catch?(Exception)
????????{
????????????//這里是在發生異常時返回的錯誤信息
????????????returnData?=?"String?Error";
????????}
????????return?returnData.ToLower();
????}
轉載于:https://www.cnblogs.com/Simcoder/archive/2011/11/05/2237252.html
總結
以上是生活随笔為你收集整理的C# HttpHelper帮助类,真正的Httprequest请求时无视编码,无视证书,无视Cookie,网页抓取...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 现在的陶瓷马桶需要安装止逆角阀吗图片?
- 下一篇: Celt Codec简单使用方法