using System; using System.IO; using System.Linq; using System.Net; using System.Text; using System.Text.RegularExpressions; namespace Whir.Software.DocumentDownLoader.Library { /// <summary> /// 模拟HTTP操作 /// </summary> public class HttpOperater { /// <summary> /// 发起Http请求 /// </summary> /// <param name="httpRequestType">请求方式</param> /// <param name="url">请求地址</param> /// <param name="cookieInput">请求时传入的cookie</param> /// <param name="cookieOutput">服务器返回的cookie</param> /// <param name="postData">发送数据</param> /// <returns></returns> public static string DoRequest(HttpRequestType httpRequestType, string url, string cookieInput, ref string cookieOutput, string postData) { string response; try { const string windowsUserName = ""; const string windowsPwd = ""; const string userAgent = "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/29.0.1547.76 Safari/537.36"; const string accept = "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"; const string acceptLanguage = "zh-CN,zh;q=0.8"; const string acceptEncoding = "gzip,deflate,sdch"; CookieContainer cookieContainer = GetCookie(url, cookieInput); var newUri = new Uri(url); var request = (HttpWebRequest)WebRequest.Create(newUri); request.PreAuthenticate = true; if (windowsUserName.Length > 0 & windowsPwd.Length > 0) { request.Credentials = new NetworkCredential(windowsUserName.Trim(), windowsPwd.Trim()); } request.Timeout = 20000; request.CookieContainer = cookieContainer; request.UserAgent = userAgent; request.Accept = accept; request.Headers["Accept-Language"] = acceptLanguage; request.Headers["Accept-Charset"] = acceptEncoding; request.Headers["Accept-Encoding"] = acceptEncoding; request.Referer = newUri.AbsoluteUri; request.Method = httpRequestType == HttpRequestType.GET ? "GET" : "POST"; if (request.Method == "POST") { request.ContentType = "application/x-www-form-urlencoded"; byte[] bytes = Encoding.UTF8.GetBytes(postData); request.ContentLength = bytes.Length; using (Stream requestStream = request.GetRequestStream()) { requestStream.Write(bytes, 0, bytes.Length); } } using (var wr = (HttpWebResponse)request.GetResponse()) { response = new StreamReader(wr.GetResponseStream(), Encoding.GetEncoding("utf-8")).ReadToEnd(); } CookieCollection cookies = cookieContainer.GetCookies(newUri); cookieOutput = CookieTostr(cookies); } catch (NotSupportedException exception) { response = exception.Message; } catch (InvalidOperationException exception) { response = exception.Message; } catch (IOException exception) { response = exception.Message; } catch (Exception exception) { response = exception.Message; } return response; } /// <summary> /// 设置cookie域 /// </summary> /// <param name="url">请求地址</param> /// <param name="cookieInput">cookie</param> /// <returns></returns> private static CookieContainer GetCookie(string url, string cookieInput) { var cookieContainer = new CookieContainer(); var cookies = new CookieCollection(); string[] cookiesArr = cookieInput.Split(';'); foreach (string s in cookiesArr) { string[] keyValuePair = s.Split('='); if (keyValuePair.Length > 1) { var cookie = new Cookie { Name = keyValuePair[0].Trim(), Value = keyValuePair[1].Trim(), Domain = GetDomain(url).Trim()//设置cookie域 }; cookies.Add(cookie); } } cookieContainer.Add(cookies); return cookieContainer; } /// <summary> /// 通过Url取得域 /// </summary> /// <param name="url"></param> /// <returns></returns> private static string GetDomain(string url) { var regex = new Regex("(?i)http[s]*://(?<domain>[\w|.]*)", RegexOptions.CultureInvariant | RegexOptions.Compiled); return regex.Match(url).Groups["domain"].Value; } /// <summary> /// 将cookie转为字符串 /// </summary> /// <param name="cookies"></param> /// <returns></returns> private static string CookieTostr(CookieCollection cookies) { return cookies.Cast<Cookie>() .Aggregate(string.Empty, (current, c) => current + (c.Name + "=" + c.Value + ";")); } } /// <summary> /// HTTP请求方式 /// </summary> public enum HttpRequestType { /// <summary> /// GET /// </summary> GET = 1, /// <summary> /// POST /// </summary> POST = 2 } }
注:使用时,ref string cookiesOutput参数是服务器返回的Cookie,需保存用于下次请求。