这篇文章主要介绍了c# webclient类用法实例,本文讲解使用webclient下载文件、openwriter打开一个流使用指定的方法将数据写入到uri以及上传文件示例,需要的朋友可以参考下
; k' Z0 |* w2 n3 S 进来的项目中要实现能够在windows service中调用指定项目的链接页面。由于访问页面时候使用的是ie浏览器或其他浏览器,所以想起用webclient类。1 t# Z+ q9 ~. B3 }3 ?& t6 t' j
如果只想从特定的uri请求文件,则使用webclient,它是最简单的.net类,它只用一两条命令执行基本操作,.net framework目前支持以http:、https和file:标识符开头的uri。! j; Z+ o8 c& r- L
webclient下载文件
, I2 o# R6 E3 W/ o9 E 使用webclient下载文件有两种方法,具体使用哪一种方法取决于文件内容的处理方式,如果只想把文件保存到磁盘上,使用downloadfile()方法,此方法有两个参数,即请求的uri和请求文件的的数据保存位置。
0 c% M6 n g. J 更常见的是,应用程序需要处理从web站点检索的数据,为此要用到openread方法,此方法返回一个stream对象,然后,可以stream对象从数据流提取到内存中。9 ~6 N" t5 F5 H$ |5 R
示例:openread(string uri);
2 b4 ?% a8 r J U. v ?7 C( c# k, H1 J% E( i; p
1/ `0 B0 e7 N0 `7 h4 M
2
$ O C8 |% p6 M 37 b7 \( B4 t; g* ^# I; |
4/ j& s" [1 |6 ]' J. ~: d
5
; [3 G: {9 w/ F$ [0 i 6 d `! n( y( C: t0 y
7 S; \# Z1 W. e; R+ n3 d
8( r& c' q1 w, F, \+ l/ ` W: _
9
o$ Y/ u1 I6 n! \ 10
( v' S- D3 O9 M4 \. o0 X9 ~& y 112 T( J# ?) n7 X% Z
12
- P4 S _1 ?/ B6 E5 a' Q0 ^9 F 13
9 l# K+ n! M- P8 a, T8 l( L+ a 14
. R9 p# F" s2 a 156 Z8 b9 @6 Q3 y5 E4 Y4 f
16
- t; f' w2 O& @0 E 17
* r y9 p( M1 d V5 F& K* ]* ~$ n$ U) ` 185 }5 i/ F# ^, C5 X- _- k
198 u# P2 Y+ `7 x8 C2 a8 y# f; b7 i
20/ B1 \4 }, V! k3 x9 ?
21openread(string uri) Z1 l7 Y9 ~& \
#region 读取指定uri的html7 T, u! H8 \2 N
///
% H2 H# d4 i/ v, d' H% l / B$ T- q& B W! M
/// 读取指定uri的html$ j3 o% C- R* F+ H
///0 I6 {: C$ q2 S( V2 Z" p* C
% F! |3 c, N5 e" G5 B0 R8 ^ 7 F' ^2 q0 Z2 d7 _# ]) ^* w
///3 X0 C% j$ B# @- a$ r
///
5 k+ c( V1 N- g2 N. R8 V; c6 ]# s7 ] private void button4_click(object sender, eventargs e)& K. [* y! S, H+ `
{
: `3 @$ P5 s$ n" C webclient wc = new webclient(); b1 S4 l5 m) n" j- D
string uri = "http://127.0.0.1/rss/sina.aspx";
( V' W4 I% p. L% g+ e stream stream = wc.openread(uri);2 z4 y4 u& U7 ^8 f ]$ }
streamreader sr = new streamreader(stream);
* Y0 n, e5 X" L* b5 o+ U8 r string strline = "";) }9 h. {% g) h4 X( r
while ((strline = sr.readline()) != null)
& P+ @( w1 W3 D! a* H# r {
! v7 [8 O3 M5 O' s9 m" s" S this.listbox1.items.add(strline);
! h6 S, z* j9 M, h' b }: O% Z% P! `& d3 p0 E2 Z& U; b
sr.close();
5 q& w# W! ?$ e+ _ }
( ?4 G9 f* v1 T% } #endregion
{4 O0 E# c( D6 @ 示例:openwriter(string uri,string method);
. Q+ W9 p( R* t0 ]2 D7 u1 W6 I2 T ?) H! J) W7 f9 t' l1 c
1
+ u5 L; z+ ^. S 2
" c& N' m% E1 q$ l1 O 34 P! k; F, a2 I! W/ A6 c0 n/ r. k
45 f8 a7 U7 y; c
5
$ O' _9 I" p0 C/ p 6
0 M6 L9 P7 d9 j* ~6 S 7! a4 G+ K* U5 _ {+ o
8
" S0 @7 }8 s8 q4 U$ X 91 ^, M0 o0 U& |$ b5 D& {
10
8 b- b# f3 }$ a 11& Z: B7 z1 j Z- l* u! B
12
% ^" p4 y7 i" o. P 13
z& [$ m6 |8 @% y/ F4 o 14, Q k! B" E1 |6 Y
15
6 i9 @% v- O3 B5 r: v! ~ 163 x- ^# G) V9 ?9 d( J. m* K
171 `8 F2 z- X; ]: v% W4 Z ?
18
3 Y' n4 w& M, k4 d 19openwriter(string uri,string method)
: ]; D) H# D+ g p7 q: C+ X. z* w #region 打开一个流使用指定的方法将数据写入到uri7 J2 {" e% d9 S9 U+ e5 v
///
# Q7 C& r. D' g# \" f) Z6 Y
M) }0 ]* w+ q( s- {3 M+ C /// 打开一个流使用指定的方法将数据写入到uri# F9 L% `, l7 ~% Y0 A( `0 H8 `
///2 [7 F. ?6 o( ^/ _0 \6 i
+ ^0 _) N) ^1 L+ p
* P. l0 R( {. P! x9 h ///
; L# l# k7 J- X L8 Z4 } ///
9 O% Y$ p; y% F. \* j& w, x private void button1_click(object sender, eventargs e)* m, p1 s& c6 l; d& y
{
% N8 d% i9 i7 T" s webclient wc = new webclient();# c2 V# b2 E8 M) o3 A: X
string uri = "http://192.168.0.35/cims30/rss.txt";
7 }! Y& Q/ {; i z$ ` stream stream = wc.openwrite(uri, "put");/ y- J4 y" d. A/ J& A
streamwriter sw = new streamwriter(stream);3 e& s! M1 h! {; s* P6 S
sw.writeline("helloworldhelloworldhelloworldhelloworld");
# x q+ f* @( D9 b2 b6 {. R- U sw.flush();5 A' r( p# X6 w; d7 e; Q' T
sw.close();
% O, d. l0 |1 C7 H& A0 [! b messagebox.show("ok");
+ L. W( `0 q, {) v) | }
( i: y) H# Z6 x% \3 } #endregion1 a" W5 [$ D1 `5 ?# F5 N" x
openwriter方法返回一个可写的数据流,便于用户把数据发送给uri,可以指定用户把数据发送给主机的方法,默认是post,上例假定0.35的服务器上有一个可写的目录刺马s,这段代码是在该目录下创建rss.txt文件,其内容为“helloworldhelloworldhelloworldhelloworld”: r* j! r w6 Z) k2 [' x+ p
上传文件
( e; j6 S6 Q4 f2 G' V" ] webclient类提供了uploadfile()和uploaddata()方法,在需要投递html窗体或上传整个文件时候,就可以使用这两个方法。uploadfile()方法把文件上传到指定的位置,其中文件名字已经给出,uploaddata()方法把字节数组提供的二进制数据上传到指定的uri;4 q) h9 S( S1 \" T" f, p
示例:上传文件$ R% N; ]$ E! m' {
?
7 e6 d, |* `) o) ` K #region 把本地文件上传到指定uri% t; w/ Y& U% S$ ?" R
///2 B7 Q; u$ j9 K6 o8 e( U
* f! @: g8 ~4 @3 B$ U# D% q /// 把本地文件上传到指定uri3 k# q& b- h; V" X# l
///9 ^( z1 P( a3 n R6 ^0 _( y
3 J9 ? a& B5 g1 c * y5 \+ n) s: p' S; e1 M: |
///
1 G* G( Z; }5 V* [+ N5 T ///& M6 S4 j% H# H( F
private void button2_click(object sender, eventargs e)
- {( S" }" [ n/ g" F5 H% h {. p% S" Z- D: P$ M
webclient wc = new webclient();# _% D# u1 F5 z5 C9 F
string targetpath = "http://127.0.0.1/rss/data configuration.zip";8 _- t" I3 H" H) o/ a
string sourcepath = "d:\\data configuration.zip";- ?1 j" L& b+ R
this.label1.text = string.format("uploading {0} to {1}", targetpath, sourcepath);
0 x3 e3 p3 e# \- L7 l5 Q; f byte[] bt = wc.uploadfile(targetpath, "put", sourcepath);
- F2 y2 Y. ^1 w% x0 Y! k q" N messagebox.show("ok");
$ | w6 f. K# g }% S9 Z: f' x% d$ I& }2 o; C l
#endregion
. y, r3 |1 K3 X4 u! S) k, n #region 把数据缓冲区上载到指定资源
7 v6 {1 P# R" j! p6 R ///
4 L( X2 Z5 e; j5 I( Q8 y/ E+ f
9 a* e& F: S2 B* m0 c! \ /// 把数据缓冲区上载到指定资源8 | `. Q; D( q7 i
///, i8 U2 r& i. ^5 `
( M8 w) s2 q9 U
8 c' h- N6 V% }# n6 a2 ]& j
///2 o& Q! X4 R* U& y( l, J
///2 t* w! l2 c* }: j6 z# ?+ v
private void button3_click(object sender, eventargs e)3 ~) O; @' t+ I* s3 l
{' W+ c5 x' e! y/ ?5 F# p
webclient wc = new webclient();
7 t( i/ h3 L, K0 ^! @9 z- C1 I1 m string targetpath = "http://127.0.0.1/rss/kaifeng.jpg";5 U* c1 c6 N$ I3 w, U8 h/ S# c
string sourcepath = @"c:\test.jpg";
! [: l3 Q: n9 n7 a filestream fs = new filestream(sourcepath, filemode.open, fileaccess.read);1 H! ^# b1 ^$ Q6 P i5 i
byte[] bt = new byte[fs.length];
% }( [% f& A L- n fs.read(bt, 0, bt.length);
2 t- {! U0 u' D" ]( T- Y wc.uploaddata(targetpath, "put", bt);0 m: [. h; M9 M8 C; t- K" j
}7 y2 T5 D3 V4 }+ l2 p% [
#endregion" Q7 \9 d7 M6 p" {6 E/ S. ^
webclient功能有限,特别是不能使用身份验证证书,这样,上传数据时候问题出现,现在许多站点都不会接受没有身份验证的上传文件。尽管可以给请求添加标题信息并检查相应中的标题信息,但这仅限于一般意义的检查,对于任何一个协议,webclient没有具体支持,。这是由于webclient是非常一般的类,可以使用任意协议发送请求和接受相应,它不能处理特定于任何协议的任何特性。6 _. m0 d% M+ q. k2 F3 T2 f
更多技术文章信息请查看: 技术文章 |
|