using System; using System.Drawing; using System.IO; using System.Net; using System.Net.Cache; using System.Text; namespace ePlatform.Processor { /// <summary> /// Http处理 /// </summary> public static class Http { /// <summary> /// 创建访问URL的Response /// </summary> /// <param name="uri"></param> /// <param name="mycookies"></param> /// <returns></returns> public static HttpWebResponse GetWebResponse(string uri, ref CookieCollection mycookies) { try { //请求 var req = HttpWebRequest.Create(uri) as HttpWebRequest; var cookies = new CookieContainer(); req.KeepAlive = true; req.AllowAutoRedirect = true; req.AllowWriteStreamBuffering = true; req.Credentials = CredentialCache.DefaultCredentials; req.Referer = "http://www.lanxe.net/"; req.Timeout = 20000; req.UserAgent = "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; .NET4.0C; .NET4.0E)"; req.CookieContainer = cookies; //加入额外的Cookie if (mycookies != null) { foreach (Cookie item in mycookies) { cookies.Add(item); } } //回应 var res = req.GetResponse() as HttpWebResponse; mycookies = cookies.GetCookies(req.RequestUri); res.Cookies = mycookies; return res; } catch { return null; } } /// <summary> /// 向网站Post数据 /// </summary> /// <param name="uri"></param> /// <param name="mycookies"></param> /// <param name="encoding"></param> /// <param name="data"></param> /// <returns></returns> public static string PostData(string uri, ref CookieCollection mycookies, string encoding, string data) { var encode = getEncoding(encoding); var datas = encode.GetBytes(data); var length = datas.Length; try { //请求 var req = HttpWebRequest.Create(uri) as HttpWebRequest; var cookies = new CookieContainer(); var cache = new RequestCachePolicy(RequestCacheLevel.NoCacheNoStore); req.KeepAlive = true; req.AllowAutoRedirect = true; req.AllowWriteStreamBuffering = true; req.Credentials = CredentialCache.DefaultCredentials; req.ContentType = "application/x-www-form-urlencoded;charset=utf-8"; req.Accept = "*/*"; req.Referer = "http://translate.google.com.hk/"; req.Timeout = 20000; req.UserAgent = "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; .NET4.0C; .NET4.0E)"; req.CachePolicy = cache; req.Method = "POST"; req.ContentLength = length; req.CookieContainer = cookies; //加入额外的Cookie if (mycookies != null) { foreach (Cookie item in mycookies) { cookies.Add(item); } } //发送内容 var stream = req.GetRequestStream(); stream.Write(datas, 0, length); stream.Close(); //获取返回的数据 var res = (HttpWebResponse)req.GetResponse(); mycookies = cookies.GetCookies(req.RequestUri); return getHtml(res, encode); } catch { return null; } } /// <summary> /// 获取网页源代码 /// </summary> /// <param name="uri"></param> /// <param name="encodeName"></param> /// <param name="outCookies"></param> /// <returns></returns> public static string GetHtml(string uri, string encodeName, ref CookieCollection mycookies) { var response = GetWebResponse(uri, ref mycookies); if (response == null) { return null; } try { var encode = getEncoding(encodeName); return getHtml(response, encode); } catch { return null; } } /// <summary> /// 获取网页流图像 /// </summary> /// <param name="uri"></param> /// <param name="mycookies"></param> /// <param name="length"></param> /// <returns></returns> public static Image GetImage(string uri, ref CookieCollection mycookies, out long length) { length = 0; var res = GetWebResponse(uri, ref mycookies); if (res == null) { return null; } try { length = res.ContentLength; Stream stream = res.GetResponseStream(); return Image.FromStream(stream, true); } catch (Exception ex) { throw ex; } } /// <summary> /// 根据名称获取网页编码格式 /// </summary> /// <param name="name"></param> /// <returns></returns> static Encoding getEncoding(string name) { if (string.IsNullOrEmpty(name)) { return Encoding.UTF8; } else if (name.ToLower() == "default") { return Encoding.Default; } else { return Encoding.GetEncoding(name); } } /// <summary> /// 从Response中获取HTML内容 /// </summary> /// <param name="res"></param> /// <param name="encode"></param> /// <returns></returns> static string getHtml(HttpWebResponse res, Encoding encode) { var outs = new StringBuilder(); var stream = res.GetResponseStream(); var reader = new StreamReader(stream, encode); // 每次读取1024 var buffer = new char[1024]; var count = reader.Read(buffer, 0, 1024); while (count > 0) { outs.Append(new String(buffer, 0, count)); count = reader.Read(buffer, 0, 1024); } // 读取完毕 reader.Close(); stream.Close(); return outs.ToString(); } } }