WPF带cookie get/post请求网页,下载文件,图片,可保持会话状态
直接写成啦一个MyNet.cs类方便使用
get/post方法请求
1 2 3 4 5 6 7 8 9 10 | //get请求 MyNet.SendRequest( "http://www.baidu.com" ); //post请求 var param = new Dictionary< string , string > { { "a" , "this is a param" }, { "b" , "this second param" } }; MyNet.SendRequest( "http://www.baidu.com" ,param); //后面有参数自动转为post,没有参数默认为get |
设置请求头
1 2 3 4 | var headers = new Dictionary< string , string >() { { "UserAgent" , "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.90 Safari/537.36" } }; MyNet.SendRequest( "http://www.baidu.com" ,param,headers); |
带cookie请求
如果需要带cookies请求的话就在发送请求之前添加cookie(可以直接从浏览器中复制出来放进去)
1 2 | MyNet.m_cookie = MyNet.FormatCookies( "thw=us; miid=417871058341351592; ali_ab=123.160.175.149.1488949082923.4; x=e%3D1%26p%3D*%26s%3D0%26c%3D0%26f%3D0%26g%3D0%26t%3D0; v=0;" , ".taobao.com" ); String str = MyNet.SendRequest( "https://myseller.taobao.com/seller_admin.htm" ); |
保持会话状态(保持cookie不丢失)
在请求之前设置如下
1 | MyNet.m_sessionStatus= true ; //默认为false不保持会话 |
下载文件
最后一个参数为下载的进度条显示,如果不需要可以不填写
1 | <ProgressBar Name= "jindu" Width= "200" ></ProgressBar> |
1 | MyNet.DownloadFile( "http://sw.bos.baidu.com/sw-search-sp/software/1c5131aea1842/ChromeStandalone_56.0.2924.87_Setup.exe" , "d:/a.exe" ,jindu); |
下面是类文件直接复制保存为MyNet.cs即可
using System; using System.Net; using System.IO; using System.Text; using System.Text.RegularExpressions; using System.Windows.Controls; using System.Security.Permissions; using System.Windows.Threading; using System.Collections.Generic; using System.Web; namespace Ank.Class { class MyNet { //是否保持会话状态 public static bool m_sessionStatus = false; //请求时要带上的cookie public static CookieCollection m_cookie = null; //代理服务器信息格式为: [主机:端口,用户名,密码]; public static string[] m_proxy = null; private static Log m_log = Log.getInstance(); public delegate void ProgressBarSetter(double value); /** * 添加cookie字符串 * s cookie字符串 * defaultDomain cookie域 * */ public static CookieCollection FormatCookies(string s, string defaultDomain) { s = s.Replace(",", "%2C"); CookieCollection cc = new CookieCollection(); if (string.IsNullOrEmpty(s) || s.Length < 5 || s.IndexOf("=") < 0) return cc; if (string.IsNullOrEmpty(defaultDomain) || defaultDomain.Length < 5) return cc; s.TrimEnd(new char[] { ';' }).Trim(); //Uri urI = new Uri(defaultDomain); //defaultDomain = urI.Host.ToString(); //用软件截取的cookie会带有expires,要把它替换掉 if (s.IndexOf("expires=") >= 0) { s = Replace(s, @"expires=[\w\s,-:]*GMT[;]?", ""); } //只有一个cookie直接添加 if (s.IndexOf(";") < 0) { System.Net.Cookie c = new System.Net.Cookie(s.Substring(0, s.IndexOf("=")), s.Substring(s.IndexOf("=") + 1)); c.Domain = defaultDomain; cc.Add(c); return cc; } //不同站点与不同路径一般是以英文道号分别 if (s.IndexOf(",") > 0) { s.TrimEnd(new char[] { ',' }).Trim(); foreach (string s2 in s.Split(',')) { cc = FormatCookies(s2, defaultDomain, cc); } return cc; } else //同站点与同路径,不同.Name与.Value { return FormatCookies(s, defaultDomain, cc); } } //添加到CookieCollection集合部分 private static CookieCollection FormatCookies(string s, string defaultDomain, CookieCollection cc) { try { s.TrimEnd(new char[] { ';' }).Trim(); System.Collections.Hashtable hs = new System.Collections.Hashtable(); foreach (string s2 in s.Split(';')) { string s3 = s2.Trim(); if (s3.IndexOf("=") > 0) { string[] s4 = s3.Split('='); hs.Add(s4[0].Trim(), s4[1].Trim()); } } string defaultPath = "/"; foreach (object Key in hs.Keys) { if (Key.ToString().ToLower() == "path") { defaultPath = hs[Key].ToString(); } else if (Key.ToString().ToLower() == "domain") { defaultDomain = hs[Key].ToString(); } } foreach (object Key in hs.Keys) { if (!string.IsNullOrEmpty(Key.ToString()) && !string.IsNullOrEmpty(hs[Key].ToString())) { if (Key.ToString().ToLower() != "path" && Key.ToString().ToLower() != "domain") { Cookie c = new Cookie(); c.Name = Key.ToString(); c.Value = hs[Key].ToString(); c.Path = defaultPath; c.Domain = defaultDomain; cc.Add(c); } } } } catch(Exception ex) { errorMsg(ex); } return cc; } private static string Replace(string strSource, string strRegex, string strReplace) { try { Regex r; r = new Regex(strRegex, RegexOptions.IgnoreCase | RegexOptions.Singleline); string s = r.Replace(strSource, strReplace); return s; } catch { return strSource; } } /** * 创建一个请求 * */ private static HttpWebRequest CreateRequest(string url = "", Dictionary<string, string> headers = null) { HttpWebRequest httpRequest; CookieContainer cookieCon = new CookieContainer(); if (m_cookie != null && m_cookie.Count > 0) { cookieCon.Add(new Uri(url), m_cookie); } httpRequest = (HttpWebRequest)WebRequest.Create(url); httpRequest.Timeout = 60000; //添加代理访问 if (m_proxy != null && m_proxy.Length > 1) { WebProxy proxy = new WebProxy(); proxy.Address = new Uri(m_proxy[0]); if (m_proxy.Length == 3) { proxy.Credentials = new NetworkCredential(m_proxy[1], m_proxy[2]); httpRequest.UseDefaultCredentials = true; } httpRequest.Proxy = proxy; } //如果有请求头的话加上请求头 if (headers != null) { WebHeaderCollection hds = new WebHeaderCollection(); foreach (var item in headers.Keys) { hds.Add(item, headers[item]); } httpRequest.Headers = hds; } //如果有cookie就加上cookie httpRequest.CookieContainer = cookieCon; return httpRequest; } /** * 从图片地址下载图片到本地磁盘 * filePath 保存的路径 * url图片地址 **/ public static bool DownImage( string url,string filePath, Dictionary<string, string> headers = null) { bool Value = false; WebResponse response = null; HttpWebRequest request = null; Stream stream = null; try { request = CreateRequest(url, headers); response = request.GetResponse(); stream = response.GetResponseStream(); if (!response.ContentType.ToLower().StartsWith("text/")) { Value = SaveBinaryFile(response, filePath); } } catch (Exception ex) { errorMsg(ex); } return Value; } /** * 将二进制文件保存到磁盘 * response 响应数据 * filePath 保存的文件路径 **/ private static bool SaveBinaryFile(WebResponse response, string filePath) { bool Value = true; byte[] buffer = new byte[1024]; try { if (File.Exists(filePath)) File.Delete(filePath); Stream outStream = System.IO.File.Create(filePath); Stream inStream = response.GetResponseStream(); int l; do { l = inStream.Read(buffer, 0, buffer.Length); if (l > 0) outStream.Write(buffer, 0, l); } while (l > 0); outStream.Close(); inStream.Close(); } catch (Exception ex) { errorMsg(ex); Value = false; } return Value; } /** * 下载文件到本地 * url 文件url地址,这里的路径要用双斜杠 * filePath 本地保存文件路径 * bar进度条 **/ public static void DownloadFile(string url, string filePath, ProgressBar bar = null, Dictionary<string, string> headers = null) { try { //去操作ui线程元素 bar.Dispatcher.BeginInvoke(new Action(() => { if (bar != null) { bar.Value = bar.Minimum; } })); HttpWebRequest req = CreateRequest(url, headers); HttpWebResponse resp = (HttpWebResponse)req.GetResponse(); long totalBytes = resp.ContentLength; bar.Dispatcher.BeginInvoke(new Action(() => { if (bar != null) { bar.Maximum = (int)totalBytes; } })); using (Stream sResp = resp.GetResponseStream()) { filePath = filePath.Replace("\\", "/"); if (!Directory.Exists(filePath.Substring(0, filePath.LastIndexOf('/')))) { Directory.CreateDirectory(filePath.Substring(0, filePath.LastIndexOf('/'))); } using (Stream sFile = new FileStream(filePath, FileMode.Create)) { long totalDownloadBytes = 0; byte[] bs = new byte[1024]; int size = sResp.Read(bs, 0, bs.Length); while (size > 0) { totalDownloadBytes += size; DispatcherHelper.DoEvents(); sFile.Write(bs, 0, size); bar.Dispatcher.BeginInvoke(new Action(() => { if (bar != null) { bar.Value = (int)totalDownloadBytes; } })); Console.WriteLine((int)totalDownloadBytes); size = sResp.Read(bs, 0, bs.Length); } } } bar.Dispatcher.BeginInvoke(new Action(() => { if (bar != null) { bar.Value = bar.Maximum; } })); } catch (Exception ex) { errorMsg(ex); } } public static string http_build_query(Dictionary<string, string> dict = null) { if (dict == null) { return ""; } var builder = new UriBuilder(); var query = HttpUtility.ParseQueryString(builder.Query); foreach (var item in dict.Keys) { query[item] = dict[item]; } return query.ToString().Trim('?').Replace("+", "%20"); } #region //post数据 /** * 发送请求,如果有postdata自动转换为post请求 * */ public static string SendRequest(string url, Dictionary<string, string> postData = null, Dictionary<string, string> headers = null, string encode = "utf-8") { string rehtml = ""; HttpWebRequest httpRequest = null; WebResponse response = null; try { Encoding encoding = Encoding.GetEncoding(encode); httpRequest = CreateRequest(url, headers); //如果有请求数据就改成post请求 if (postData != null && postData.Count != 0) { var parstr = http_build_query(postData); byte[] bytesToPost = encoding.GetBytes(parstr); httpRequest.ContentType = "application/x-www-form-urlencoded"; httpRequest.Method = "POST"; httpRequest.ContentLength = bytesToPost.Length; Stream requestStream = httpRequest.GetRequestStream(); requestStream.Write(bytesToPost, 0, bytesToPost.Length); requestStream.Close(); } else { httpRequest.Method = "GET"; } response = httpRequest.GetResponse(); //从响应头自动判断网页编码 //Content - Type:text / html; charset = utf - 8 string contentType = response.Headers["Content-Type"]; //Encoding encoding = null; Regex regex = new Regex("charset\\s*=\\s*(\\S+)", RegexOptions.IgnoreCase); Match match = null; if (contentType != null) { match = regex.Match(contentType); //在响应头中找到编码声明 if (match.Success) { //找到页面里的编码声明,就按编码转换 try { encoding = Encoding.GetEncoding(match.Groups[1].Value.Trim()); using (TextReader reader = new StreamReader(response.GetResponseStream(), encoding)) { rehtml = reader.ReadToEnd(); } } catch (Exception ex) { errorMsg(ex); rehtml = ""; } } } //响应头类型为空或没有找到编码声明的情况,直接从响应内容中找编码声明 using (TextReader reader = new StreamReader(response.GetResponseStream(), Encoding.Default)) { rehtml = reader.ReadToEnd(); regex = new Regex("<\\s*meta.+charset\\s*=\\s*(\\S+)\\s*\"", RegexOptions.IgnoreCase); match = regex.Match(rehtml); //找到编码声明就转码,找不到拉倒,不管啦 if (match.Success) { try { encoding = Encoding.GetEncoding(match.Groups[1].Value.Trim()); rehtml = encoding.GetString(Encoding.Default.GetBytes(rehtml)); // Console.WriteLine(str); } catch (Exception ex) { errorMsg(ex); //转码出错,原样返回,不管它是啥东西,不处理啦 } } } } catch (Exception ex) { errorMsg(ex); rehtml = ""; } if (m_sessionStatus) { m_cookie = httpRequest.CookieContainer.GetCookies(new Uri(url)); } else { m_cookie = null; } httpRequest = null; if (response != null) { response.Dispose(); response = null; } return rehtml; #endregion } private static void errorMsg(Exception ex = null) { if (ex != null) { Console.WriteLine(ex.Message); m_log.write(ex.Message, "litedb"); m_log.write(ex.ToString(), "litedb"); } } public static class DispatcherHelper { [SecurityPermissionAttribute(SecurityAction.Demand, Flags = SecurityPermissionFlag.UnmanagedCode)] public static void DoEvents() { DispatcherFrame frame = new DispatcherFrame(); Dispatcher.CurrentDispatcher.BeginInvoke(DispatcherPriority.Background, new DispatcherOperationCallback(ExitFrames), frame); try { Dispatcher.PushFrame(frame); } catch (InvalidOperationException) { } } private static object ExitFrames(object frame) { ((DispatcherFrame)frame).Continue = false; return null; } } } }
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· .NET Core 托管堆内存泄露/CPU异常的常见思路
· PostgreSQL 和 SQL Server 在统计信息维护中的关键差异
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库
· 上周热点回顾(2.17-2.23)