WPF带cookie get/post请求网页,下载文件,图片,可保持会话状态
版权声明:
本文为博主原创文章,转载请声明原文链接...谢谢。o_0。
更新时间:
2019-05-28 13:28:36
温馨提示:
学无止境,技术类文章有它的时效性,请留意文章更新时间,如发现内容有误请留言指出,防止别人"踩坑",我会及时更新文章
直接写成啦一个MyNet.cs类方便使用
get/post方法请求
//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设置请求头
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(可以直接从浏览器中复制出来放进去)
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不丢失)
在请求之前设置如下
MyNet.m_sessionStatus=true;//默认为false不保持会话
设置之后再请求会保存每次请求的cookie到内在,后面的每次请求都会自动带上
下载文件
最后一个参数为下载的进度条显示,如果不需要可以不填写
<ProgressBar Name="jindu" Width="200"></ProgressBar>
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;
}
}
}
}