这篇文章主要介绍了c# webclient类用法实例,本文讲解使用webclient下载文件、openwriter打开一个流使用指定的方法将数据写入到uri以及上传文件示例,需要的朋友可以参考下; Q j' e6 C. ~* D8 K
进来的项目中要实现能够在windows service中调用指定项目的链接页面。由于访问页面时候使用的是ie浏览器或其他浏览器,所以想起用webclient类。
7 e' f; i! n. {" b V! U7 r 如果只想从特定的uri请求文件,则使用webclient,它是最简单的.net类,它只用一两条命令执行基本操作,.net framework目前支持以http:、https和file:标识符开头的uri。
4 _8 y9 q0 w5 Q" g7 f webclient下载文件* }9 s1 w/ X* L& _ _) y
使用webclient下载文件有两种方法,具体使用哪一种方法取决于文件内容的处理方式,如果只想把文件保存到磁盘上,使用downloadfile()方法,此方法有两个参数,即请求的uri和请求文件的的数据保存位置。 q& j e) F7 s% }) h7 u8 T
更常见的是,应用程序需要处理从web站点检索的数据,为此要用到openread方法,此方法返回一个stream对象,然后,可以stream对象从数据流提取到内存中。- f- k4 u" D3 E5 m2 X9 ~% l
示例:openread(string uri);/ R+ H! p/ q( q$ Z
?6 b" o A4 l `* N( M
1% M8 ^# ]/ u& L" Q+ U* m
2
& b' n# l# h6 a Z1 T 3
! H) ]; C+ r+ ]. R 4
" O0 o s3 }5 u" Z1 \& F7 J 5
- I7 L9 h* X+ O. H 6
$ T7 _- |: u4 X. R; a: s9 J 7! d3 S7 ^$ U$ ]
8
' }. g" ^; r1 X6 ~- I0 n 9, u) ]; O6 K0 r! Z2 K' y
10# F9 u7 r( n% A8 f* t8 w( q0 p( B
118 q7 W& i, p7 {& j4 H3 E7 i5 V, @7 p
12
. ~& l" I8 m3 J! R 13
/ m* v/ J$ a0 P3 v, d+ y3 \. R 14. E: D( \- W% G4 _
15
8 J* _, v0 A; h8 `8 Z+ K 16( Z) w$ D! p1 }' r# B e
17
F9 a0 t+ U# y 18 D0 Z1 j5 \2 a; o
19
( P5 l5 s1 }) E. r2 q( T$ y* p- H 20
* g9 _$ } F( C u; u 21openread(string uri)
1 j* J' e" V- N8 U" e7 n #region 读取指定uri的html' z( p5 V/ S3 ^/ @4 H
///
" K0 _0 |2 w9 y' ~5 u7 S ) Y9 ]- a% i) n9 r7 y! I
/// 读取指定uri的html
' _2 u3 z8 |1 B' ` ///
2 _0 ~7 v/ n1 C
' o; q2 P, X6 r4 Z6 E" ]
8 J- A% y* D+ Z ///9 v0 z+ a, B: x/ Z
///
/ B }. G9 _+ g+ i+ l7 @ private void button4_click(object sender, eventargs e)
" T& [! H2 R% D( R {
8 @4 u: j' n7 w2 q" H webclient wc = new webclient();
7 @0 R8 U2 W; @; G! o( m4 r string uri = "http://127.0.0.1/rss/sina.aspx";
I9 \1 i! C% B" q! d/ Y A stream stream = wc.openread(uri);5 q: ]$ v8 e3 p' F$ H
streamreader sr = new streamreader(stream);
; C: M3 t. ` Z3 L& `8 |* F* U string strline = "";7 O% j) ]/ u0 o4 N
while ((strline = sr.readline()) != null)8 p, s4 ~* ~8 e! d' i2 p
{& l* C0 I# E$ d/ U! N3 j& U
this.listbox1.items.add(strline);2 m1 ?7 l0 `/ ?( P o1 x# b# g
}2 u* V4 [9 `. t& D9 i1 e7 J6 |4 a
sr.close();
0 ~) [. `" m. ~, M0 p; K }
& t& y3 B p5 m4 l) t #endregion0 n& Z) P, V, z$ D% w
示例:openwriter(string uri,string method);
) Q% N* ]( m0 @2 l1 y. p3 ? ?4 t/ t3 @8 P9 x) T) Z
10 f* Y+ L s! {& W( i
2- a7 w8 @% P' E" w
3$ y. q |7 I" n- F7 F
45 T4 |% ~( ~9 z# v; \$ W/ J
55 T) }. U& A4 e! h7 U' @& d2 F
6
) j& k, m- I$ a* |: U7 {8 c 7
) _7 {" U: f' _$ x* S0 c 8
; p5 l& \4 }) d% C$ d+ D- W1 v 9
( }9 J1 Z, |% U: ~8 n 105 Z6 p* V& _0 T% X9 F1 O3 p% t
11
8 A" V, h) c2 O! T& Z 122 w5 d# N9 h4 t; }3 T) n# {
13/ V+ x. y7 G" ^5 }3 w
14
5 r- Y# ? m8 y 15- f+ I: R: ^. U' l
16; g2 Y3 o; g4 y' d5 |5 A7 y, O
176 u4 P/ a8 v' I
18
9 S8 E/ m2 @& [1 P$ i2 e9 Z: f 19openwriter(string uri,string method)+ Y8 K7 h0 @0 v8 @
#region 打开一个流使用指定的方法将数据写入到uri
$ A3 N! }' b- q/ g t& P$ Z S( s ///( j; Y; ?: V" {9 X
, u# V; {3 l- o" E6 Q5 r/ c6 d
/// 打开一个流使用指定的方法将数据写入到uri
' c. P; \! F1 S; ]1 a ///
& j* M5 U2 A3 a( [: V) v* Q# G( ^, ?0 X( e' m
4 W! A6 i! L; H$ }* n$ ~+ j, N
/// ~/ C9 d! P6 m+ f
///: }# o" y- F# c$ F
private void button1_click(object sender, eventargs e)- E6 Z* Q+ X8 _2 d
{( b/ l+ u" F* Z0 _$ M) K) w
webclient wc = new webclient();
0 a. @4 |3 Z. ^$ G: t0 N string uri = "http://192.168.0.35/cims30/rss.txt";
2 b; g; P1 L7 ~+ g4 u6 p5 x* t stream stream = wc.openwrite(uri, "put");
( s. j2 F$ n d5 f8 c. @ streamwriter sw = new streamwriter(stream);% l: H4 z- h9 _- B v- g* l' c
sw.writeline("helloworldhelloworldhelloworldhelloworld");' |9 V& Y# b: A' x; a$ L
sw.flush();
+ t4 | Y3 I1 f sw.close();: ]# r7 Y* x* B. l. A" J
messagebox.show("ok");1 U4 ~- L' R5 w: u" q3 @
}) Q4 B; S# Z7 i! G
#endregion O" F8 m* @" w" I
openwriter方法返回一个可写的数据流,便于用户把数据发送给uri,可以指定用户把数据发送给主机的方法,默认是post,上例假定0.35的服务器上有一个可写的目录刺马s,这段代码是在该目录下创建rss.txt文件,其内容为“helloworldhelloworldhelloworldhelloworld”
5 j* t) @, n% a: q. H. B& Q% e# w* R 上传文件8 D/ L' ~+ I; ]/ c0 K% Q6 p2 B
webclient类提供了uploadfile()和uploaddata()方法,在需要投递html窗体或上传整个文件时候,就可以使用这两个方法。uploadfile()方法把文件上传到指定的位置,其中文件名字已经给出,uploaddata()方法把字节数组提供的二进制数据上传到指定的uri;' M+ J! `# j- \: p' r; Z. W5 a& n
示例:上传文件
j, h, Q1 }1 k ?
4 L% V+ J4 P. f, u* e #region 把本地文件上传到指定uri
$ V/ o8 T5 Y: ~& l, C+ }/ j2 n ///. [! c1 p" m% b- C1 W; H5 E
3 r1 j6 W2 R' Q2 f O A /// 把本地文件上传到指定uri
% Y4 y* Z. _1 z. _- x4 H ///
" W; o* x2 t, Y$ V4 C: h! {3 S4 q! Q6 u. m' |* q
4 n! C! b }" G0 e ///0 X( R1 v- I7 q4 S
///
+ L3 t" a/ L6 Z' z! \0 N private void button2_click(object sender, eventargs e)4 w0 k( U# V3 S7 G( B- g
{7 g0 J. N* e7 k" a! ^
webclient wc = new webclient();0 Q, }- C2 B0 I$ O' P! ~: V
string targetpath = "http://127.0.0.1/rss/data configuration.zip";
0 j! S; i$ W! G; P string sourcepath = "d:\\data configuration.zip";
3 ^7 k- j& h2 F. w" q1 M6 E this.label1.text = string.format("uploading {0} to {1}", targetpath, sourcepath);
$ |1 k7 v/ R/ L3 T8 c' ]+ [: _0 X byte[] bt = wc.uploadfile(targetpath, "put", sourcepath);. Y' S% Q# M* T5 i0 J
messagebox.show("ok");% Z7 `6 ?, a. d9 \0 Z8 B
}5 ~0 w# H+ ~( L2 A
#endregion4 w3 E4 V9 u/ P1 x' n
#region 把数据缓冲区上载到指定资源- a( e) B" O9 k1 }. N2 R. v
///) R/ _' @, M$ B/ h& z2 x" U9 k
# l2 _$ U2 Z2 D, I% l! E
/// 把数据缓冲区上载到指定资源
" q3 Y5 O8 g+ f1 d* s+ i ///6 N. A6 r5 B$ W, o. l6 v1 f
# u( z7 u8 @# g
) B, ]8 ~, s6 t3 i/ P ///4 f4 u6 ~: W1 l2 p$ Y7 K8 P) N1 J5 O l
///( ~5 I5 \9 Y' T3 R/ c
private void button3_click(object sender, eventargs e)
3 Z5 T: y0 p; w" c {
" H. L4 n0 B" Y! S: N% Y) r2 z webclient wc = new webclient();
, P/ S8 g; |3 S& G3 A, a9 K string targetpath = "http://127.0.0.1/rss/kaifeng.jpg";; c4 d8 L; W' {- u
string sourcepath = @"c:\test.jpg";- T" {$ f5 c6 S# D/ f4 N
filestream fs = new filestream(sourcepath, filemode.open, fileaccess.read);0 j: v4 u0 Y0 _! y) X4 z
byte[] bt = new byte[fs.length];1 T) K c. I! r- I) H2 R( e
fs.read(bt, 0, bt.length);
) J2 T7 T* u" I6 k wc.uploaddata(targetpath, "put", bt);3 a! c) R. P5 C8 ~ h; ]* P! Y
}% G8 [" D7 y9 W6 P; q D; ?
#endregion
6 _/ l9 K, t$ {/ H/ Y+ Z p0 } webclient功能有限,特别是不能使用身份验证证书,这样,上传数据时候问题出现,现在许多站点都不会接受没有身份验证的上传文件。尽管可以给请求添加标题信息并检查相应中的标题信息,但这仅限于一般意义的检查,对于任何一个协议,webclient没有具体支持,。这是由于webclient是非常一般的类,可以使用任意协议发送请求和接受相应,它不能处理特定于任何协议的任何特性。
9 d. v" J. g' h, e" h' W. h( O9 Y更多技术文章信息请查看: 技术文章 |
|