zoukankan
html css js c++ java
WebClient 保持 Session 和 Cookie
有些朋友说 WebClient 不能保持 Session 和 Cookie,只有 HttpWebRequest 才能保持 Session。实际上我们只要重写 WebClient 的 GetWebRequest 方法就可以使 WebClient 保持 Session 和 Cookie。
下面是
HttpClient 类, 它继承自 WebClient,并重写了
GetWebRequest 方法。关键是要定义一个 Cookie 容器(红色代码部分):
/**/
///
<summary>
///
支持 Session 和 Cookie 的 WebClient。
///
</summary>
public
class
HttpClient : WebClient
{
//
Cookie 容器
private
CookieContainer
cookieContainer
;
/**/
///
<summary>
///
创建一个新的 WebClient 实例。
///
</summary>
public
HttpClient()
{
this
.
cookieContainer
=
new
CookieContainer();
}
/**/
///
<summary>
///
创建一个新的 WebClient 实例。
///
</summary>
///
<param name="cookie">
Cookie 容器
</param>
public
HttpClient(CookieContainer cookies)
{
this
.
cookieContainer
=
cookies;
}
/**/
///
<summary>
///
Cookie 容器
///
</summary>
public
CookieContainer Cookies
{
get
{
return
this
.
cookieContainer
; }
set
{
this
.
cookieContainer
=
value; }
}
/**/
///
<summary>
///
返回带有 Cookie 的 HttpWebRequest。
///
</summary>
///
<param name="address"></param>
///
<returns></returns>
protected
override
WebRequest GetWebRequest(Uri address)
{
WebRequest request
=
base
.GetWebRequest(address);
if
(request
is
HttpWebRequest)
{
HttpWebRequest httpRequest
=
request
as
HttpWebRequest;
httpRequest.CookieContainer = cookieContainer;
}
return
request;
}
封装了PostData, GetSrc 和 GetFile 方法
#region
封装了PostData, GetSrc 和 GetFile 方法
/**/
///
<summary>
///
向指定的 URL POST 数据,并返回页面
///
</summary>
///
<param name="uriString">
POST URL
</param>
///
<param name="postString">
POST 的 数据
</param>
///
<param name="postStringEncoding">
POST 数据的 CharSet
</param>
///
<param name="dataEncoding">
页面的 CharSet
</param>
///
<returns>
页面的源文件
</returns>
public
string
PostData(
string
uriString,
string
postString,
string
postStringEncoding,
string
dataEncoding,
out
string
msg)
{
try
{
//
将 Post 字符串转换成字节数组
byte
[] postData
=
Encoding.GetEncoding(postStringEncoding).GetBytes(postString);
this
.Headers.Add(
"
Content-Type
"
,
"
application/x-www-form-urlencoded
"
);
//
上传数据,返回页面的字节数组
byte
[] responseData
=
this
.UploadData(uriString,
"
POST
"
, postData);
//
将返回的将字节数组转换成字符串(HTML);
string
srcString
=
Encoding.GetEncoding(dataEncoding).GetString(responseData);
srcString
=
srcString.Replace(
"
\t
"
,
""
);
srcString
=
srcString.Replace(
"
\r
"
,
""
);
srcString
=
srcString.Replace(
"
\n
"
,
""
);
msg
=
string
.Empty;
return
srcString;
}
catch
(WebException we)
{
msg
=
we.Message;
return
string
.Empty;
}
}
/**/
///
<summary>
///
获得指定 URL 的源文件
///
</summary>
///
<param name="uriString">
页面 URL
</param>
///
<param name="dataEncoding">
页面的 CharSet
</param>
///
<returns>
页面的源文件
</returns>
public
string
GetSrc(
string
uriString,
string
dataEncoding,
out
string
msg)
{
try
{
//
返回页面的字节数组
byte
[] responseData
=
this
.DownloadData(uriString);
//
将返回的将字节数组转换成字符串(HTML);
string
srcString
=
Encoding.GetEncoding(dataEncoding).GetString(responseData);
srcString
=
srcString.Replace(
"
\t
"
,
""
);
srcString
=
srcString.Replace(
"
\r
"
,
""
);
srcString
=
srcString.Replace(
"
\n
"
,
""
);
msg
=
string
.Empty;
return
srcString;
}
catch
(WebException we)
{
msg
=
we.Message;
return
string
.Empty;
}
}
/**/
///
<summary>
///
从指定的 URL 下载文件到本地
///
</summary>
///
<param name="uriString">
文件 URL
</param>
///
<param name="fileName">
本地文件的完成路径
</param>
///
<returns></returns>
public
bool
GetFile(
string
urlString,
string
fileName,
out
string
msg)
{
try
{
this
.DownloadFile(urlString, fileName);
msg
=
string
.Empty;
return
true
;
}
catch
(WebException we)
{
msg
=
we.Message;
return
false
;
}
}
#endregion
}
相关文章:
使用WebClient自动填写并提交ASP.NET页面表单
使用HttpWebRequest提交ASP.NET表单并保持Session和Cookie
查看全文
相关阅读:
ios动态创建类Class
iOS 视图控制器转场详解
HTML5新增标签属性
HTML5入门篇
ExtJs 添加员工 实例 ---- 锚点布局 anchor 可自动伸缩
Ext 初级UI设计
Ext 面向对象程序设计 入门篇
改善EF代码的方法(下)
改善EF代码的方法(上)
EF 存储过程(下)
原文地址:https://www.cnblogs.com/anjou/p/1206832.html
最新文章
if语句,if...else语句的分析
反汇编角度判断函数有几个参数,分别是什么
Android探索之百度地图开发
深入Java源码剖析之Set集合
一篇文章让你马上入门Hibernate
图解Java数据结构之稀疏数组
JDBC框架
图解Java数据结构之队列
图解Java数据结构之单链表
图解Java数据结构之双向链表
热门文章
图解Java数据结构之环形链表
Hibernate对象状态之间的神奇转换
iOS通讯录开发
WWDC 2013 Session笔记
iOS-点击推送消息跳转处理
GIT在iOS开发中的使用
不修改Xcode项目加载Reveal
iOS字体加载三种方式
最快让你上手ReactiveCocoa之基础篇
iOS使用Workspace来管理多项目
Copyright © 2011-2022 走看看