这篇文章主要介绍了c# webclient类用法实例,本文讲解使用webclient下载文件、openwriter打开一个流使用指定的方法将数据写入到uri以及上传文件示例,需要的朋友可以参考下
( v& q0 t# v# ~7 x& o 进来的项目中要实现能够在windows service中调用指定项目的链接页面。由于访问页面时候使用的是ie浏览器或其他浏览器,所以想起用webclient类。
" j" H5 m$ ?- Y2 J" I$ R 如果只想从特定的uri请求文件,则使用webclient,它是最简单的.net类,它只用一两条命令执行基本操作,.net framework目前支持以http:、https和file:标识符开头的uri。
7 H' m2 I1 o2 S" A. D; J0 H# H/ Y4 M webclient下载文件, Y, l* j, b& o% I& [9 z
使用webclient下载文件有两种方法,具体使用哪一种方法取决于文件内容的处理方式,如果只想把文件保存到磁盘上,使用downloadfile()方法,此方法有两个参数,即请求的uri和请求文件的的数据保存位置。7 a( Y; h( j, l- |8 m/ ]
更常见的是,应用程序需要处理从web站点检索的数据,为此要用到openread方法,此方法返回一个stream对象,然后,可以stream对象从数据流提取到内存中。9 ?- K6 o- _+ L/ x0 U0 K3 z$ |
示例:openread(string uri);% `5 r: [2 _+ K
?
7 O' W3 O: C# j8 j3 l 1
# F( u0 w3 j4 R) [ 2
: }/ j8 \2 s$ ?/ O, K# w 3
$ e7 ?1 U; Y' j. m* L5 o( ~ 48 }" {% U: q5 W" V0 r! V* o2 R
5
# T( j" E& p# C; I0 g& ` 67 d) h& k$ J& c% U4 I2 W3 Z
7
9 T4 D- i2 }4 P( A8 Y/ r8 d/ ^# T% w0 s 8* ]5 V- F8 L: X, V1 x7 i" V
9
' ~/ _7 W4 |) j' M! S. M! q 10! I0 q1 R) A5 }9 n! x+ z
11
0 W5 e: \% b* F 12. W! k+ D" W6 J+ [9 m' m, ~! P
13: @, H& s' p( O5 n
14$ _: W% c& Z- r9 Y* |- k
15
9 q& K. l# U& i7 I; \! b 16; L% E" i0 o4 @7 Z1 A
17
- g7 x+ m2 D1 V, P8 O. R 183 R, c3 ]8 }8 _% O- C
19
; u/ \2 ^2 v% E+ ?: \% e% K 20& a* e9 Y) O) i% c& G; K" N+ X( y
21openread(string uri)
" J0 d5 S* j. A% O; ] #region 读取指定uri的html
# V/ K7 X' B, u/ w5 q! k- f ///
6 C8 V. @* W( D( T( ~ $ ]9 ?& [; R' T: X6 S" t
/// 读取指定uri的html/ Z* R( W$ w; b3 X
///
@! ^$ g. M! S( j
* {6 ^( X7 f4 ~ v, C6 G% K
* y; i9 k7 O( k ///8 C% S6 }+ {3 F0 p* z6 Y1 v
///
. R n) n& a C0 x6 q8 r7 j private void button4_click(object sender, eventargs e)
$ L, F" x, n6 N6 c& t {
; e% a( _+ @3 c( w4 Z webclient wc = new webclient();7 d" V2 i) v* B+ ~" o# X4 `
string uri = "http://127.0.0.1/rss/sina.aspx";9 Y/ `1 g; o$ R {2 v6 Q% r9 v; ~
stream stream = wc.openread(uri);' W, Z$ P. ~* m( X/ A/ |, l
streamreader sr = new streamreader(stream);6 y; Q' q) y9 }
string strline = "";; Z' E* c5 C# |2 q" j9 c
while ((strline = sr.readline()) != null)
! E# v- {) l& `5 i {7 [4 R+ H$ n3 ]* c3 b D/ k
this.listbox1.items.add(strline);" J9 Z# d: R, ~; I
}
! Q2 M6 o! a% D# e% w sr.close();
% q" A7 H) Q/ Q) A. T, n }3 }2 P( D5 j8 G: S
#endregion
1 L8 e$ r+ y2 e 示例:openwriter(string uri,string method);% K, ~/ D9 {$ D5 Q" @- d! ?8 M
?5 [5 c4 E- M# j
1$ Y* |( a6 q: p0 l
2$ I- e- ~- r, X( w; W0 Y% N& P: Y; e
3
+ Q8 u" Q; c& P% \ 4' ~' ?$ t! C6 e( V
5
/ }* d+ o" d' H: m1 z 6: @: x% n( X6 j$ Q0 d/ d
7) p: D! n1 ~8 ]) y3 z) k
82 Q/ V# {: w( d% I6 f, L
9% o/ g5 @, Z* C9 N) @
10( j, K: F6 t5 C; C) R/ @
112 ^4 U; S1 a7 ^* U. [6 F) X
12% n9 ]& `: _+ w/ O, P
13
: m4 [/ S1 _! q# J; @- w 14
% O% @& }/ m E* u0 X. K- \ 15
+ P# [0 J5 n( T8 x1 k 16
, w/ [7 v- {# N9 l) }* N; r; O 17" Z+ U( X! @0 |; S! B, h
186 L) D' |$ ~& T! M; m) Q
19openwriter(string uri,string method)" e$ I' J8 @9 V- v4 i" c% d
#region 打开一个流使用指定的方法将数据写入到uri
7 B2 ]2 j, P' | } ///' ~" X5 R. m0 q0 x7 e
* _) G# \, o2 t) _ /// 打开一个流使用指定的方法将数据写入到uri
! P8 A3 Q: G; }! D7 r ///
6 u; L. J) \& ^6 j; k, b7 N2 ?' `+ s- R6 w
! r8 T, G, ^( f. j
///0 w% F) m Q, |! j( y2 v$ c* r
///. t* N ^- L! E s$ k
private void button1_click(object sender, eventargs e)
4 } z% {9 V9 E2 G h. p {0 V$ S4 y" O9 ?( O: C3 W' o
webclient wc = new webclient();- R/ m: l' v3 n4 q; q- ^7 a
string uri = "http://192.168.0.35/cims30/rss.txt";2 ]7 v3 D5 ^. d& _! F
stream stream = wc.openwrite(uri, "put");
4 n; Y9 x' N- l- \, l# Y" a' Q streamwriter sw = new streamwriter(stream);
" q) B$ h" j5 F' `4 ^; s sw.writeline("helloworldhelloworldhelloworldhelloworld");, p/ {" G* W2 z4 \2 D
sw.flush();
: v; T& p; q' X! C& I+ c sw.close();
7 d) m8 `& m7 z/ Z+ o; M messagebox.show("ok");
# Q5 _4 Q$ k( y/ k+ v }
, s! A6 G' p7 {% o0 b #endregion
. B3 t: V0 y, P$ t openwriter方法返回一个可写的数据流,便于用户把数据发送给uri,可以指定用户把数据发送给主机的方法,默认是post,上例假定0.35的服务器上有一个可写的目录刺马s,这段代码是在该目录下创建rss.txt文件,其内容为“helloworldhelloworldhelloworldhelloworld”
2 J+ t% _9 U8 ? 上传文件
9 E5 q) z0 A ?7 s webclient类提供了uploadfile()和uploaddata()方法,在需要投递html窗体或上传整个文件时候,就可以使用这两个方法。uploadfile()方法把文件上传到指定的位置,其中文件名字已经给出,uploaddata()方法把字节数组提供的二进制数据上传到指定的uri;
4 X8 G0 U/ e" V# B. ^) I+ f9 p: E 示例:上传文件( ^4 h1 f# l/ y
?6 H" ?- L' W: ~ }/ {
#region 把本地文件上传到指定uri
* s3 N- g4 r! v2 ]4 J6 | ///
+ G' n7 w2 ~$ D f
2 b4 N* [$ F+ f! P' g /// 把本地文件上传到指定uri
; P* E+ h' |! n9 a' F! c4 Q" h ///8 {* W2 ? h! [. i9 r) S
* t) q z9 a4 r+ a% x/ _7 U
T+ n" r* \6 b: X* @. t% _: \) W6 w ///) v# y1 P9 k& k$ |- q* e
///
4 y7 ~7 a \- k9 _% Z private void button2_click(object sender, eventargs e)3 z& s" n* j: t1 A/ d
{
% {) f* D2 k; U/ d O' P webclient wc = new webclient();
8 Y) h# S# }0 t2 a; O7 F. r string targetpath = "http://127.0.0.1/rss/data configuration.zip";" E" R4 ^6 f; J
string sourcepath = "d:\\data configuration.zip";
0 ~3 K# E! w0 W( P. P g, M, _ this.label1.text = string.format("uploading {0} to {1}", targetpath, sourcepath);7 f8 X1 w p' T5 z: G2 U% {9 r
byte[] bt = wc.uploadfile(targetpath, "put", sourcepath);" A# I( T1 q, z: l; j0 K0 q/ G( }
messagebox.show("ok");
# Z) d# t' J) d7 \' p- m; c }
" t4 P( h1 O( t2 Q #endregion
4 ^9 G: U# h9 l( w! z' D1 { #region 把数据缓冲区上载到指定资源. H; Y, m$ [9 ^1 x7 Z
///+ o. H- E$ _8 m( q k1 \
/ y. P" m8 p; z) S7 T1 z /// 把数据缓冲区上载到指定资源
; D1 ]3 Y4 T# m, F: E+ y* X ///
% k( J) g1 P& _% A9 R& c D
: z1 }% Q6 F$ p; I3 L- Z6 ]; }
( w% o% h* s; N) K+ |; r ///
- r( W R& l9 w2 e$ J! N3 J$ }5 s ///1 @3 n7 g( E- q/ |$ u
private void button3_click(object sender, eventargs e)/ w/ X4 S7 Z6 Q* m" P( q
{% ]% e5 `' z0 o6 i3 q1 B2 h' T+ r1 ]
webclient wc = new webclient();
, f! L. n6 Q4 o4 @5 W. B string targetpath = "http://127.0.0.1/rss/kaifeng.jpg";
J3 m/ ^. K( N& H* X string sourcepath = @"c:\test.jpg";
" l2 y# m1 Q5 q4 z# a, } filestream fs = new filestream(sourcepath, filemode.open, fileaccess.read);. _& I0 |% R7 `6 E. U/ \
byte[] bt = new byte[fs.length];
% L/ f$ k$ G( n fs.read(bt, 0, bt.length);
* D$ o8 }# M% w. K5 D2 U" g' Z wc.uploaddata(targetpath, "put", bt);
& ?4 l9 O3 g) ?" p1 [0 b }, O) g$ N& S+ y3 r$ X& f2 S
#endregion
; O5 q. A8 I9 }& [) ~1 @8 M! I webclient功能有限,特别是不能使用身份验证证书,这样,上传数据时候问题出现,现在许多站点都不会接受没有身份验证的上传文件。尽管可以给请求添加标题信息并检查相应中的标题信息,但这仅限于一般意义的检查,对于任何一个协议,webclient没有具体支持,。这是由于webclient是非常一般的类,可以使用任意协议发送请求和接受相应,它不能处理特定于任何协议的任何特性。- G/ g! }+ A" T/ a8 S% c: F- T/ f
更多技术文章信息请查看: 技术文章 |
|