这篇文章主要介绍了c# webclient类用法实例,本文讲解使用webclient下载文件、openwriter打开一个流使用指定的方法将数据写入到uri以及上传文件示例,需要的朋友可以参考下3 A2 F; v7 f+ v! ?8 b+ E" B. q
进来的项目中要实现能够在windows service中调用指定项目的链接页面。由于访问页面时候使用的是ie浏览器或其他浏览器,所以想起用webclient类。
" W) y" o; r9 H! ] 如果只想从特定的uri请求文件,则使用webclient,它是最简单的.net类,它只用一两条命令执行基本操作,.net framework目前支持以http:、https和file:标识符开头的uri。
( c+ ~) ?$ _) O webclient下载文件
& V% J7 _ P; N 使用webclient下载文件有两种方法,具体使用哪一种方法取决于文件内容的处理方式,如果只想把文件保存到磁盘上,使用downloadfile()方法,此方法有两个参数,即请求的uri和请求文件的的数据保存位置。
' p8 D* _: l7 C) g 更常见的是,应用程序需要处理从web站点检索的数据,为此要用到openread方法,此方法返回一个stream对象,然后,可以stream对象从数据流提取到内存中。
; _ }+ f3 d: p7 z: g 示例:openread(string uri);
4 E# j( {, \* @: M, ? ?0 Y; d+ l& @: ^1 d
1 T+ y5 k/ R/ t; s7 @6 f9 m
2
& l( q! t& A) ? 3
: G7 b5 D$ ~- E7 L% b 4
+ h/ [" b+ e6 l/ e) }( C 5
7 \( g+ H9 a7 r+ R2 v, |9 I: s 66 V/ g5 b8 s1 k) \
7! X8 c0 D& ?( B2 I1 R6 E2 s
81 ^) A$ P* b: e: J4 X) \6 n F
9
: x9 _ }% P+ n7 e% z* a 10
Y3 L/ r! y& s U# p2 o/ c0 ~ 11
) ?5 C$ j5 c8 o* f: w. b 12. F( G1 B" W# T: S9 a
13
: u: ]+ V8 n. i' p9 \, u# m6 i 14
& I* C1 _( v& k* E! K: z$ I 15
8 ~ B( I! ?! f3 R; G; t 16
; ~/ O( S8 e; ]' F. \# ] 17+ w a/ y% Z7 }# P
18
s L" w( \) Q/ f2 B. m- x F 19
2 p$ B4 ]: J9 D6 p4 h 20
7 B; g. A, d% o2 |7 L4 A+ h a+ n1 N 21openread(string uri)) Z$ L ~ m6 f# @* D$ d
#region 读取指定uri的html
. A: z) R' s1 A8 |8 ?0 d4 V2 m ///) V. L" z9 s3 X
/ @- r- }% Z$ B5 r1 `% n /// 读取指定uri的html
H4 n; A/ q* T/ X8 a& N ///
5 B0 _( Q q1 z9 i7 q9 v; b l3 d2 n
1 X; Y; q6 y, q. M4 j# v
///. v% v0 T: s: P+ A8 G& \
///
; g+ J( k- K. f private void button4_click(object sender, eventargs e)
5 w% Y. ~6 d* J$ t3 K0 `6 T7 u {4 }8 @; a2 k" _( e' J% I
webclient wc = new webclient();8 G+ {2 z7 Q7 Q$ g2 H
string uri = "http://127.0.0.1/rss/sina.aspx";
0 j9 {5 x: V# w5 A2 j7 Q+ M stream stream = wc.openread(uri);0 O+ F6 d4 b* ^( ^* P
streamreader sr = new streamreader(stream);
7 A* e# k0 w1 K8 O* {% o( j string strline = "";6 F% u( W- d' B3 s
while ((strline = sr.readline()) != null)
; V: _4 n' G% `, e i {& r0 n' x J# ^' @" B S# J- D
this.listbox1.items.add(strline);3 X5 I" _2 t1 C! `) V/ R8 D/ Q# I
}
) p: J2 Q* C3 ?! D5 k sr.close();
, J" T! v5 q6 e) p2 c; A }
, M: v& U, M+ `6 Q; M* L #endregion' i. O% G4 O6 R: b6 E* v
示例:openwriter(string uri,string method);- z( t% N4 X. _% A, } ~
?
3 v! C& O! U0 E2 r 1
+ W" `. t6 R) |& q( }# V 2% I+ K4 w7 w3 P4 ?/ {
3" V! V4 R# R( _' D, `' M+ [3 l
4
6 k) o6 n, H4 J- `# W# L* i 5
7 Y8 e* s- W; k4 ?8 e8 j 69 P/ z5 U$ u) G" t0 X: p
75 z# X. `% O0 D) N2 o8 B& U8 \
8
1 p& L9 D2 W- @2 C 98 e/ ~) `! T) f7 f7 m
10! B m0 J1 ?9 q4 b. O* G+ B
11
' R. y* J$ B: z+ z" S! y8 s 12+ K) l- n3 v. G. F; f7 S
13! r( m/ ?, `+ Q( }2 {$ r
143 }5 k, B% ?4 \4 t& ?( X
151 M! g, {* f4 ?; e- C6 v1 J
16
( X2 y! Q& F# @/ x, u3 a/ k6 m/ w 17
6 s7 _0 q# q5 x6 q, {2 [3 s. r! G 181 h0 ^/ ~* N: @8 {( M7 o( x
19openwriter(string uri,string method); s* v# P9 ]1 \! F/ ^% U
#region 打开一个流使用指定的方法将数据写入到uri
+ C% C) \2 S; Q7 U ///
7 L. j x/ D% U1 Q 5 N; R) e: ]! f: L3 C
/// 打开一个流使用指定的方法将数据写入到uri' _, J3 c. q5 [4 v9 f) }, F
///
0 Q) Q" H8 X% \0 ]& q0 d
: D1 M# i+ r) X3 Q6 Y4 S1 K6 X+ M - z w, W+ N, F
///
, V/ q! w0 `3 B* E# ^ ///
8 z5 V9 |1 w3 o$ R( I' z9 N private void button1_click(object sender, eventargs e)+ |7 ~6 k8 e5 i
{
0 ^4 O+ H! u4 y5 z7 P* Q webclient wc = new webclient();
8 K r! Y, v9 j% y& ?- @; y/ S string uri = "http://192.168.0.35/cims30/rss.txt";) L( i9 G6 V0 K2 v& J
stream stream = wc.openwrite(uri, "put");1 ]; y+ ~( k6 l! R! r
streamwriter sw = new streamwriter(stream);
( }# ?8 ?/ ] T' S, } sw.writeline("helloworldhelloworldhelloworldhelloworld");. A( J% t8 v6 M; P: B& z& ]
sw.flush();5 Q& @ L- I4 z7 Z$ Q$ H. r* Q5 b
sw.close();
- E+ L L9 s" z$ o4 U" R2 s messagebox.show("ok");! k, I$ H' D# L1 c& e6 v% Q
}& x& E& I2 o7 W# m6 f
#endregion
* s/ o8 c/ [; t5 O, ~, F& T! ` openwriter方法返回一个可写的数据流,便于用户把数据发送给uri,可以指定用户把数据发送给主机的方法,默认是post,上例假定0.35的服务器上有一个可写的目录刺马s,这段代码是在该目录下创建rss.txt文件,其内容为“helloworldhelloworldhelloworldhelloworld”
( B& O0 `; {/ I+ t 上传文件
" E2 g7 K1 Z9 m& D& D webclient类提供了uploadfile()和uploaddata()方法,在需要投递html窗体或上传整个文件时候,就可以使用这两个方法。uploadfile()方法把文件上传到指定的位置,其中文件名字已经给出,uploaddata()方法把字节数组提供的二进制数据上传到指定的uri;! ^) z0 r0 X7 K9 C; p# o
示例:上传文件8 x0 E6 `# k: O: h. ]' S: O
?1 u0 o1 X+ C7 n- g0 j+ q
#region 把本地文件上传到指定uri1 u$ k4 w' c& w# F
///8 K6 U! q! y% Z' Q- o3 _
, {3 i/ h5 `, r* P N /// 把本地文件上传到指定uri
% l& f2 i0 {5 I4 t- v3 H ///+ B) b0 n% }. }# h& c9 t! X6 h
7 w: u( L {& y+ |! D* \+ c" E+ \# s
7 t4 I% S+ q3 L0 R/ Z: B ///, f, b. r+ J* B( S
///
8 v* ]1 a" J8 U& S. {9 V b. B private void button2_click(object sender, eventargs e)1 V B! ^. {* D) Y( N* \
{2 x) H# b/ {" n; t; ^
webclient wc = new webclient();8 i$ b% B& N$ ~3 v
string targetpath = "http://127.0.0.1/rss/data configuration.zip";
% v1 T- k# z& z string sourcepath = "d:\\data configuration.zip";; B/ b, @6 N8 m$ g! Q
this.label1.text = string.format("uploading {0} to {1}", targetpath, sourcepath);
+ H( q6 M' |7 j6 ?9 K0 K byte[] bt = wc.uploadfile(targetpath, "put", sourcepath);9 O# ]# C4 r4 T
messagebox.show("ok");
! ~6 ~9 C# q9 l$ E }
$ q2 N+ D$ h9 s! U* F #endregion5 P6 e# q; u; T/ q; h. K+ A2 o
#region 把数据缓冲区上载到指定资源
/ g" t; X0 u' `6 s7 y: w: c ///
* N, F# P* N& s; I9 c) k' t% Y
5 d* _+ m. H* [# ?# ?! C3 y2 x /// 把数据缓冲区上载到指定资源. A, D- R# R$ Y0 n
///( X% W4 \& e% [0 C$ n, _
. Q% f. w# E1 K
* Q6 N7 V" B; X2 b ///; I! J/ Q" Z* J0 q& m- Q$ ]
///8 r) @# O& \( X5 g5 t7 _& W
private void button3_click(object sender, eventargs e)
' k+ v, t* J, O3 Z {) |7 z4 M" r. y8 R9 r" {! L
webclient wc = new webclient(); O0 j- _: L5 Z' d
string targetpath = "http://127.0.0.1/rss/kaifeng.jpg";
0 Y( m- W, W4 G! n2 c string sourcepath = @"c:\test.jpg";" K2 m3 M: R5 u/ B
filestream fs = new filestream(sourcepath, filemode.open, fileaccess.read);
5 ~: J/ N2 ? I5 ~ Z byte[] bt = new byte[fs.length];
6 B: K* l X5 Z' X7 R R9 [6 N fs.read(bt, 0, bt.length);
) z1 O0 m5 ?* U% } wc.uploaddata(targetpath, "put", bt);, @! Z. g/ M! ^" v
}
4 J( y$ a8 _% `2 u: M, M #endregion
2 }# w$ L) h# j3 @' S webclient功能有限,特别是不能使用身份验证证书,这样,上传数据时候问题出现,现在许多站点都不会接受没有身份验证的上传文件。尽管可以给请求添加标题信息并检查相应中的标题信息,但这仅限于一般意义的检查,对于任何一个协议,webclient没有具体支持,。这是由于webclient是非常一般的类,可以使用任意协议发送请求和接受相应,它不能处理特定于任何协议的任何特性。
9 \1 r; F9 f$ Z更多技术文章信息请查看: 技术文章 |
|