using
System;
using
System.Collections.Generic;
using
System.Text;
using
System.Net;
using
System.Net.Sockets;
using
System.Collections;
using
System.IO;
using
System.Text.RegularExpressions;
using
RE
= System.Text.RegularExpressions.Regex
;
using
System.Security.Cryptography.X509Certificates;
/***************************************************************************************************************************************************
* *
文件名:HttpProc.cs
* *
创建人:HeDaode
* *
日 期:2007.09.01
* *
描 述:实现HTTP协议中的GET、POST请求
* *
使 用:HttpProc.WebClient client = new HttpProc.WebClient();
client.Encoding = System.Text.Encoding.Default;//
默认编码方式,根据需要设置其他类型
client.OpenRead("http://www.baidu.com");//
普通get请求
MessageBox.Show(client.RespHtml);//
获取返回的网页源代码
client.DownloadFile("http://www.codepub.com/upload/163album.rar",@"C:\163album.rar");//
下载文件
client.OpenRead("http://passport.baidu.com/?login","username=zhangsan&password=123456");//
提交表单,此处是登录百度的示例
client.UploadFile("http://hiup.baidu.com/zhangsan/upload", @"file1=D:\1.mp3");//
上传文件
client.UploadFile("http://hiup.baidu.com/zhangsan/upload", "folder=myfolder&size=4003550",@"file1=D:\1.mp3");//
提交含文本域和文件域的表单
*****************************************************************************************************************************************************/
namespace
HttpProc
{
///
<summary>
///
上传事件委托
///
</summary>
///
<param name="sender"></param>
///
<param name="e"></param>
public
delegate
void
WebClientUploadEvent
(object
sender, HttpProc.UploadEventArgs
e);
///
<summary>
///
下载事件委托
///
</summary>
///
<param name="sender"></param>
///
<param name="e"></param>
public
delegate
void
WebClientDownloadEvent
(object
sender, HttpProc.DownloadEventArgs
e);
///
<summary>
///
上传事件参数
///
</summary>
public
struct
UploadEventArgs
{
///
<summary>
///
上传数据总大小
///
</summary>
public
long
totalBytes;
///
<summary>
///
已发数据大小
///
</summary>
public
long
bytesSent;
///
<summary>
///
发送进度(0-1)
///
</summary>
public
double
sendProgress;
///
<summary>
///
发送速度Bytes/s
///
</summary>
public
double
sendSpeed;
}
///
<summary>
///
下载事件参数
///
</summary>
public
struct
DownloadEventArgs
{
///
<summary>
///
下载数据总大小
///
</summary>
public
long
totalBytes;
///
<summary>
///
已接收数据大小
///
</summary>
public
long
bytesReceived;
///
<summary>
///
接收数据进度(0-1)
///
</summary>
public
double
ReceiveProgress;
///
<summary>
///
当前缓冲区数据
///
</summary>
public
byte
[] receivedBuffer;
///
<summary>
///
接收速度Bytes/s
///
</summary>
public
double
receiveSpeed;
}
///
<summary>
///
实现向WEB服务器发送和接收数据
///
</summary>
public
class
WebClient
{
private
WebHeaderCollection
requestHeaders, responseHeaders;
private
TcpClient
clientSocket;
private
MemoryStream
postStream;
private
Encoding
encoding = Encoding
.Default;
private
const
string
BOUNDARY = "--HEDAODE--"
;
private
const
int
SEND_BUFFER_SIZE = 10245;
private
const
int
RECEIVE_BUFFER_SIZE = 10245;
private
string
cookie = ""
;
private
string
respHtml = ""
;
private
string
strRequestHeaders = ""
;
private
string
strResponseHeaders = ""
;
private
int
statusCode = 0;
private
bool
isCanceled = false
;
public
event
WebClientUploadEvent
UploadProgressChanged;
public
event
WebClientDownloadEvent
DownloadProgressChanged;
///
<summary>
///
初始化WebClient类
///
</summary>
public
WebClient()
{
responseHeaders = new
WebHeaderCollection
();
requestHeaders = new
WebHeaderCollection
();
}
///
<summary>
///
读取指定URL的文本
///
</summary>
///
<param name="URL">
请求的地址
</param>
///
<returns>
服务器响应文本
</returns>
public
string
OpenRead(string
URL)
{
requestHeaders.Add("Connection"
, "close"
);
SendRequestData(URL, "GET"
);
return
GetHtml();
}
//
解决证书过期无法访问的问题
class
CertPolicy
: ICertificatePolicy
{
public
bool
CheckValidationResult(ServicePoint
srvpt, X509Certificate
cert, WebRequest
req, int
certprb)
{ return
true
; }
}
///
<summary>
///
采用https协议访问网络
///
</summary>
///
<param name="URL">
url
地址
</param>
///
<param name="strPostdata">
发送的数据
</param>
///
<returns></returns>
public
string
OpenReadWithHttps(string
URL,string
strPostdata)
{
ServicePointManager
.CertificatePolicy = new
CertPolicy
();
HttpWebRequest
request = (HttpWebRequest
)WebRequest
.Create(URL);
request.CookieContainer = new
CookieContainer
();
request.Method = "POST"
;
request.Accept = "*/*"
;
request.ContentType="application/x-www-form-urlencoded"
;
byte
[] buffer = this
.encoding.GetBytes(strPostdata);
request.ContentLength = buffer.Length;
request.GetRequestStream().Write(buffer, 0, buffer.Length);
HttpWebResponse
response = (HttpWebResponse
)request.GetResponse();
StreamReader
reader = new
StreamReader
(response.GetResponseStream(), encoding);
this
.respHtml = reader.ReadToEnd();
foreach
(System.Net.Cookie
ck in
response.Cookies)
{
this
.cookie += ck.Name + "="
+ ck.Value + ";"
;
}
reader.Close();
return
respHtml;
}
///
<summary>
///
读取指定URL的文本
///
</summary>
///
<param name="URL">
请求的地址
</param>
///
<param name="postData">
向服务器发送的文本数据
</param>
///
<returns>
服务器响应文本
</returns>
public
string
OpenRead(string
URL, string
postData)
{
byte
[] sendBytes = encoding.GetBytes(postData);
postStream = new
MemoryStream
();
postStream.Write(sendBytes, 0, sendBytes.Length);
requestHeaders.Add("Content-Length"
, postStream.Length.ToString());
requestHeaders.Add("Content-Type"
, "application/x-www-form-urlencoded"
);
requestHeaders.Add("Connection"
, "close"
);
SendRequestData(URL, "POST"
);
return
GetHtml();
}
///
<summary>
///
读取指定URL的流
///
</summary>
///
<param name="URL">
请求的地址
</param>
///
<param name="postData">
向服务器发送的数据
</param>
///
<returns>
服务器响应流
</returns>
public
Stream
GetStream(string
URL, string
postData)
{
byte
[] sendBytes = encoding.GetBytes(postData);
postStream = new
MemoryStream
();
postStream.Write(sendBytes, 0, sendBytes.Length);
requestHeaders.Add("Content-Length"
, postStream.Length.ToString());
requestHeaders.Add("Content-Type"
, "application/x-www-form-urlencoded"
);
requestHeaders.Add("Connection"
, "close"
);
SendRequestData(URL, "POST"
);
MemoryStream
ms = new
MemoryStream
();
SaveNetworkStream(ms);
return
ms;
}
///
<summary>
///
上传文件到服务器
///
</summary>
///
<param name="URL">
请求的地址
</param>
///
<param name="fileField">
文件域(格式如:file1=C:\test.mp3&file2=C:\test.jpg)
</param>
///
<returns>
服务器响应文本
</returns>
public
string
UploadFile(string
URL, string
fileField)
{
return
UploadFile(URL, ""
, fileField);
}
///
<summary>
///
上传文件和数据到服务器
///
</summary>
///
<param name="URL">
请求地址
</param>
///
<param name="textField">
文本域(格式为:name1=value1&name2=value2)
</param>
///
<param name="fileField">
文件域(格式如:file1=C:\test.mp3&file2=C:\test.jpg)
</param>
///
<returns>
服务器响应文本
</returns>
public
string
UploadFile(string
URL, string
textField, string
fileField)
{
postStream = new
MemoryStream
();
if
(textField != ""
&& fileField != ""
)
{
WriteTextField(textField);
WriteFileField(fileField);
}
else
if
(fileField != ""
)
{
WriteFileField(fileField);
}
else
if
(textField != ""
)
{
WriteTextField(textField);
}
else
throw
new
Exception
("
文本域和文件域不能同时为空。"
);
//
写入结束标记
byte
[] buffer = encoding.GetBytes("--"
+ BOUNDARY + "--\r\n"
);
postStream.Write(buffer, 0, buffer.Length);
//
添加请求标头
requestHeaders.Add("Content-Length"
, postStream.Length.ToString());
requestHeaders.Add("Content-Type"
, "multipart/form-data; boundary="
+ BOUNDARY);
requestHeaders.Add("Connection"
, "Keep-Alive"
);
//
发送请求数据
SendRequestData(URL, "POST"
, true
);
//
返回响应文本
return
GetHtml();
}
///
<summary>
///
分析文本域,添加到请求流
///
</summary>
///
<param name="textField">
文本域
</param>
private
void
WriteTextField(string
textField)
{
string
[] strArr = RE
.Split(textField, "&"
);
textField = ""
;
foreach
(string
var in
strArr)
{
Match
M = RE
.Match(var, "([^=]+)=(.+)"
);
textField += "--"
+ BOUNDARY + "\r\n"
;
textField += "Content-Disposition: form-data; name=\""
+ M.Groups[1].Value + "\"\r\n\r\n"
+ M.Groups[2].Value + "\r\n"
;
}
byte
[] buffer = encoding.GetBytes(textField);
postStream.Write(buffer, 0, buffer.Length);
}
///
<summary>
///
分析文件域,添加到请求流
///
</summary>
///
<param name="fileField">
文件域
</param>
private
void
WriteFileField(string
fileField)
{
string
filePath = ""
;
int
count = 0;
string
[] strArr = RE
.Split(fileField, "&"
);
foreach
(string
var in
strArr)
, {
Match
M = RE
.Match(var, "([^=]+)=(.+)"
);
filePath = M.Groups[2].Value;
fileField = "--"
+ BOUNDARY + "\r\n"
;
fileField += "Content-Disposition: form-data; name=\""
+ M.Groups[1].Value + "\"; filename=\""
+ Path
.GetFileName(filePath) + "\"\r\n"
;
fileField += "Content-Type: image/jpeg\r\n\r\n"
;
byte
[] buffer = encoding.GetBytes(fileField);
postStream.Write(buffer, 0, buffer.Length);
//
添加文件数据
FileStream
fs = new
FileStream
(filePath, FileMode
.Open, FileAccess
.Read);
buffer = new
byte
[50000];
do
{
count = fs.Read(buffer, 0, buffer.Length);
postStream.Write(buffer, 0, count);
} while
(count > 0);
fs.Close();
fs.Dispose();
fs = null
;
buffer = encoding.GetBytes("\r\n"
);
postStream.Write(buffer, 0, buffer.Length);
}
}
///
<summary>
///
从指定URL下载数据流
///
</summary>
///
<param name="URL">
请求地址
</param>
///
<returns>
数据流
</returns>
public
Stream
DownloadData(string
URL)
{
requestHeaders.Add("Connection"
, "close"
);
SendRequestData(URL, "GET"
);
MemoryStream
ms = new
MemoryStream
();
SaveNetworkStream(ms, true
);
return
ms;
}
///
<summary>
///
从指定URL下载文件
///
</summary>
///
<param name="URL">
文件URL地址
</param>
///
<param name="fileName">
文件保存路径,含文件名(如:C:\test.jpg)
</param>
public
void
DownloadFile(string
URL, string
fileName)
{
requestHeaders.Add("Connection"
, "close"
);
SendRequestData(URL, "GET"
);
FileStream
fs = new
FileStream
(fileName, FileMode
.Create);
SaveNetworkStream(fs, true
);
fs.Close();
fs = null
;
}
///
<summary>
///
向服务器发送请求
///
</summary>
///
<param name="URL">
请求地址
</param>
///
<param name="method">
POST
或GET
</param>
///
<param name="showProgress">
是否显示上传进度
</param>
private
void
SendRequestData(string
URL, string
method, bool
showProgress)
{
clientSocket = new
TcpClient
();
Uri
URI = new
Uri
(URL);
clientSocket.Connect(URI.Host, URI.Port);
requestHeaders.Add("Host"
, URI.Host);
byte
[] request = GetRequestHeaders(method + " "
+ URI.PathAndQuery + " HTTP/1.1"
);
clientSocket.Client.Send(request);
//
若有实体内容就发送它
if
(postStream != null
)
{
byte
[] buffer = new
byte
[SEND_BUFFER_SIZE];
int
count = 0;
Stream
sm = clientSocket.GetStream();
postStream.Position = 0;
UploadEventArgs
e = new
UploadEventArgs
();
e.totalBytes = postStream.Length;
System.Diagnostics.Stopwatch
timer = new
System.Diagnostics.Stopwatch
();//
计时器
timer.Start();
do
{
//
如果取消就推出
if
(isCanceled) { break
; }
//
读取要发送的数据
count = postStream.Read(buffer, 0, buffer.Length);
//
发送到服务器
sm.Write(buffer, 0, count);
//
是否显示进度
if
(showProgress)
{
//
触发事件
e.bytesSent += count;
e.sendProgress = (double
)e.bytesSent / (double
)e.totalBytes;
double
t = timer.ElapsedMilliseconds / 1000;
t = t <= 0 ? 1 : t;
e.sendSpeed = (double
)e.bytesSent / t;
if
(UploadProgressChanged != null
) { UploadProgressChanged(this
, e); }
}
} while
(count > 0);
timer.Stop();
postStream.Close();
//postStream.Dispose();
postStream = null
;
}//end if
}
///
<summary>
///
向服务器发送请求
///
</summary>
///
<param name="URL">
请求URL地址
</param>
///
<param name="method">
POST
或GET
</param>
private
void
SendRequestData(string
URL, string
method)
{
SendRequestData(URL, method, false
);
}
///
<summary>
///
获取请求头字节数组
///
</summary>
///
<param name="request">
POST
或GET请求
</param>
///
<returns>
请求头字节数组
</returns>
private
byte
[] GetRequestHeaders(string
request)
{
requestHeaders.Add("Accept"
, "*/*"
);
requestHeaders.Add("Accept-Language"
, "zh-cn"
);
requestHeaders.Add("User-Agent"
, "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; SV1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)"
);
string
headers = request + "\r\n"
;
foreach
(string
key in
requestHeaders)
{
headers += key + ":"
+ requestHeaders[key] + "\r\n"
;
}
//
有Cookie就带上Cooki
发表评论
-
Asp.net模板引擎技术
2010-10-20 09:18 1161以前听我朋友说起php的模板引擎技术的时候似懂非懂哪 ... -
ASP.NET页面数据导出 excel表方法
2010-08-13 01:07 1319//1、由dataset生成 public void Cr ... -
在 ASP.NET 中实现不同角色的用户使用不同登录界面的方法
2010-07-31 15:54 2224很多用户在开发 ASP.NET 应用程序时都有这样的需求: ... -
详解C#委托,事件与回调函数
2010-06-09 01:25 1405.Net编程中最经常用的 ... -
C#与javascript简单交互
2010-06-08 19:36 20311.asp.net 呼叫js Response ... -
NET连接ORACLE数据库的方法及示例(转)
2010-03-07 09:30 4537.NET连接ORACLE数据库的方 ... -
dropdownlist绑定的二种方法
2010-02-26 22:57 895dropdownlist绑定的二种方法 ... -
正则表达式用例
2009-09-07 12:54 8011。^\d+$ //匹配非负整数(正整数 + 0) 2。^[ ... -
技术解析:什么是模式? 什么是框架?
2009-09-07 18:11 719技术解析:什么是模式 ... -
关于Gridview中使用控件和图片导出到Excel的处理
2009-09-28 01:04 1842首先是大家在网上能搜索一箩筐的仅导出数据的做法:view pl ...
相关推荐
C# http Get/POST请求封装类
c# http协议,实现get或post发送请求 并返回内容
C# 使用Get和Post请求获取数据,Get Post 请求, POST传值
C#-HTTP请求(Post,GET,表单)
1,不知道咋get、post请求的; 2,写的接口总是被攻击的可以借鉴此加密方式。 【2】为啥要写这个 1,近期我们团队做的App接口被破解,老是被频繁调用,服务器致瘫; 2,想了办法加密了,如果遇到问题想调试,没办法...
实现HTTP协议中的GET、POST请求
C#后台 Get、Post 网络请求 获取网页信息--可以做到一个文件多出使用(后台结果公告内容,通过获取结果公告内容抓取到前台显示) 微信公众平台调用post提交数据 有些需要传递json格式的数据如果不是json格式的数据...
C#-HTTP请求接收(Post数据流,GET,表单)
C# 后台请求接口的方法(GET,POST)
客户端以窗口形式展示、通过HTTP协议Get、Post到Webservice的返回数据,代码简单易懂,非常适合学习参考!代码注释清晰!(IIS配置可参考:http://blog.csdn.net/f_felix/article/details/51934284)
C#的http发送post和get请求源码,非常轻量简单,测试的时候简单实用下挺不错
http请求Get和Post两种方式基本代码
通过C#,根据Http协议,创建GET方式的HTTP请求,创建POST方式的HTTP请求。
自己封装的C#实现HTTP请求的动态链接库,dll文件,包含XML文件。原创资源
c# 运用get/post 和使用webservicec# 运用get/post 和使用webservicec# 运用get/post 和使用webservicec# 运用get/post 和使用webservice
自己封装的基于C#的发送HTTP请求。包括普通POST\GET\FILE形式。 获取HTML:var hp = new HttpHelper("http://www.cnblogs.com"); hp.Send(); 发送POST:var hp = new HttpHelper("http://www.cnblogs.com/upload",...
C# http GetPOST请求封装类