这篇文章主要介绍了c# webclient类用法实例,本文讲解使用webclient下载文件、openwriter打开一个流使用指定的方法将数据写入到uri以及上传文件示例,需要的朋友可以参考下
8 |$ W2 G- p i! p0 J' d/ @3 w0 f 进来的项目中要实现能够在windows service中调用指定项目的链接页面。由于访问页面时候使用的是ie浏览器或其他浏览器,所以想起用webclient类。
' q9 g3 g+ q2 i2 u; v 如果只想从特定的uri请求文件,则使用webclient,它是最简单的.net类,它只用一两条命令执行基本操作,.net framework目前支持以http:、https和file:标识符开头的uri。
, d; m3 j1 O6 ^ webclient下载文件1 S) R) _5 k# a' i( a3 y
使用webclient下载文件有两种方法,具体使用哪一种方法取决于文件内容的处理方式,如果只想把文件保存到磁盘上,使用downloadfile()方法,此方法有两个参数,即请求的uri和请求文件的的数据保存位置。7 @6 Y7 k" F( F7 m4 q" f( `
更常见的是,应用程序需要处理从web站点检索的数据,为此要用到openread方法,此方法返回一个stream对象,然后,可以stream对象从数据流提取到内存中。
9 `+ A3 N( M4 Q' T! g+ O$ h* J 示例:openread(string uri);, w, T5 G$ z; R j c& I& J
?
- L5 v" G3 ^, j' @ 1
3 a6 n- J: ^) W3 \ 2" j& ^ [; G# k" }
33 s% Y" e. C4 `5 F( m& _0 A
4
6 Y9 S5 O% C6 U, X' N( A* L/ |1 B: h5 j 5
# a% p+ j- e% y" g 6. \7 u1 b. p2 K r
7
& h' Y/ z- V" ?, b; g: q# g9 a 8
, ^9 s# Z+ J! F q9 Y D, i- e% V 9
3 d' ?9 `9 k* M4 i& _ 10
( O6 Z9 ` i. { 11
9 Y0 {3 g! [/ M& G% e/ g% A 12
* }2 y" ^1 T* T! Q/ ^ 13
# k& v/ r- U& \* P1 l6 N 149 }' M A* K2 c8 ? y- n
152 P | O+ p2 Z0 ` F& X% b# ]" m
16
_( i4 Z& K' o: X1 F6 Y, _ 17& U) R% `3 w% I" v) ^# |( X
18
3 r0 p+ R2 a* y# {, e t: E X 190 _" i# _) b2 H1 Q: l2 b+ i
20. U3 d7 f: [: e3 x6 x
21openread(string uri) T$ `; W+ D' I, E+ v1 ^
#region 读取指定uri的html1 L* w4 E6 c( O$ N! f% C3 n7 k
///$ o( j1 a9 L2 V: D
8 P+ L+ `" C* Q" `* n8 O8 M /// 读取指定uri的html5 d* r. d; d( S2 z- \+ }
///( H7 }6 z5 W; J5 [7 Q: u
" m o5 \: E2 e+ _
# p1 K( O/ |2 ?* ^3 n- E5 D8 E2 v6 B ///! K; u8 p6 t$ W* r
///; O* c. G& X, d& F6 W8 z2 D
private void button4_click(object sender, eventargs e)1 `! @ [( R5 \, ^
{
) ~* x1 z9 Q* A; a webclient wc = new webclient();; S' a" o. V; Z
string uri = "http://127.0.0.1/rss/sina.aspx";5 h1 s( K* l6 v9 _+ m4 n i0 P
stream stream = wc.openread(uri);
# j& m6 v# D3 G# I streamreader sr = new streamreader(stream);+ I4 Z( p# i: { b" _+ }
string strline = "";
/ R5 o, n" o5 @" X y* D while ((strline = sr.readline()) != null)
/ ?# D% d& w# h6 j! u; V {8 g f, t/ l: G# Q7 U2 ~# M0 x4 u' r
this.listbox1.items.add(strline);, x3 [" }" y) P& r
}
7 m# \5 [. }! Y$ {, F; U+ D0 h2 \ sr.close();
j! p. g* u6 e- p j; M' q }
% K; b; B# j# {6 A- a1 ~ R9 B. W #endregion
& P: r7 a' B$ R 示例:openwriter(string uri,string method);
; d' l# j4 K. g/ h' N* |) g ?2 l/ q+ @0 S& P) I# Y: P, |
1
7 z, q% t' Q& v( o: {2 A* u4 M 2
$ s# D$ X, G& e) n& l) | 3
5 q' X( w8 ~- s0 f8 P+ u 4( O& @! l W O& G% Z
56 w" I9 A+ a' m' H! v9 s4 g
60 G6 `, ~7 i% [ \ t. J' J% {
7+ E. b& W' Z- q ]. y- B0 ? o
8" h6 p& v1 u- e5 }/ v# V
9/ C* m V8 l4 z" i, h
10
/ X" H5 l' j# M, ^) H. M 11
; W0 J; m4 }' L" [" d 12( D* p' O z3 p1 j t8 P+ V1 P
13
) d. _/ i4 _ p- [% {6 v 14
) r. M; G& M" d; F! Z9 y6 H$ W 15
2 ]" O; b. ^; g0 E" o) K 16
% Q. |( O3 h# H- M- s 17
L; ?8 a9 D9 |# H% F0 z 18( T0 u7 Q% U+ H" \( D& @
19openwriter(string uri,string method)
& j# c4 _- r8 D6 O }" Z* {9 K #region 打开一个流使用指定的方法将数据写入到uri. i7 c: T' ~8 B! s
///9 D4 U& o" `- z# |0 \
. S) t, ^( {1 b* |
/// 打开一个流使用指定的方法将数据写入到uri
: l3 ]2 K4 L) d! I6 T5 Q /// g5 T% G2 H5 a, K# @! s
/ Q/ p! c! r- g% \7 x* M, C u : |' a# N4 r# m. N0 U3 `% n* x; a% j
///
9 K1 w a3 f1 u0 N' R# r ///2 B" Q) Q2 E4 \# l9 z3 W" X
private void button1_click(object sender, eventargs e)' b8 N2 R9 h! G
{( I* Z |5 ~) ]1 s. A
webclient wc = new webclient();: L6 ]0 Y4 ~0 t0 ^1 U+ w; p% Q9 T% N/ k
string uri = "http://192.168.0.35/cims30/rss.txt";5 p+ }& t. |5 i( M. o$ q$ r* S( W
stream stream = wc.openwrite(uri, "put"); I9 p' O9 F5 `, d$ k* v) B
streamwriter sw = new streamwriter(stream);
. }# K, L& A9 v( {3 Q sw.writeline("helloworldhelloworldhelloworldhelloworld");
: }. ]# V& x3 \# o5 r, m sw.flush();( _. v" P w! [0 y2 e
sw.close();
- M P4 z/ }5 H0 `7 b2 x! _ messagebox.show("ok");
9 Z! V8 K1 s/ k9 T; j. O } N) q* N) V* k9 P8 [7 u2 N
#endregion2 w4 c. h) t4 P) A8 f/ J
openwriter方法返回一个可写的数据流,便于用户把数据发送给uri,可以指定用户把数据发送给主机的方法,默认是post,上例假定0.35的服务器上有一个可写的目录刺马s,这段代码是在该目录下创建rss.txt文件,其内容为“helloworldhelloworldhelloworldhelloworld”9 [+ ^" u" V* v, h
上传文件7 d% _" ?0 L# D, K2 z
webclient类提供了uploadfile()和uploaddata()方法,在需要投递html窗体或上传整个文件时候,就可以使用这两个方法。uploadfile()方法把文件上传到指定的位置,其中文件名字已经给出,uploaddata()方法把字节数组提供的二进制数据上传到指定的uri;$ v% \$ U9 x$ }
示例:上传文件
2 @/ ~# E5 E7 J4 e2 n8 g ?1 A) j' k9 B$ l6 Z& y$ z# S& U: l
#region 把本地文件上传到指定uri$ E2 q1 _8 O* H! g5 V& y
///7 r3 A3 B, x0 r* Z1 z0 j
$ T5 n6 O3 N: ~+ a/ j /// 把本地文件上传到指定uri$ \) j4 m1 a7 S$ \' L7 S& c" p
///# {" s- @2 `0 P! U
# d$ L, h: w. f0 i) r3 s
" r8 Z5 H5 @; H% L% x" _ ///
; C/ b, S: p6 U) h ///
/ B9 Z5 G: E8 l. p h private void button2_click(object sender, eventargs e), R' C3 K! Q: e/ x% Z: u3 O
{
" C7 H" m" L% f2 p3 |) a webclient wc = new webclient();, p9 \4 M& R. [: V0 x
string targetpath = "http://127.0.0.1/rss/data configuration.zip";
# L0 Y* ~) Z" j8 _# e string sourcepath = "d:\\data configuration.zip";
2 t* H" r' K: A- k8 @! K this.label1.text = string.format("uploading {0} to {1}", targetpath, sourcepath);
9 T1 W& f& {( v0 F& ~# k byte[] bt = wc.uploadfile(targetpath, "put", sourcepath);" [% o4 P! W; ^. O+ D0 a' T
messagebox.show("ok");/ q% t9 K/ |% }- l& G: }
}! K+ G& [; z$ i7 f/ A/ b! F
#endregion
% n; c& N( T5 k1 A/ j# e, Z7 s+ j) k #region 把数据缓冲区上载到指定资源# B6 I' e. o+ N+ Q
///: [) z5 H2 b& q8 r. G
- z/ ^5 G8 z+ G9 p+ p: K5 N4 i /// 把数据缓冲区上载到指定资源
6 ~& O# J* p; S" V ///$ a; G1 Q5 y- D, K. L6 M" A. h, r
, I+ u3 z/ F1 V) i% @7 z1 e7 y5 g& W
2 E- B! B+ t3 O
///
8 M! [( i% x* S' l) z; u ///9 x) D) l4 d- g* C, P' A
private void button3_click(object sender, eventargs e)
( r/ |8 l4 C- Z2 Z) I; c {
. Q2 J: W8 M' O webclient wc = new webclient();- w( C% N. R' r
string targetpath = "http://127.0.0.1/rss/kaifeng.jpg";
: F$ j3 Z m3 e5 c) g0 C) w) t& H string sourcepath = @"c:\test.jpg";
; ?+ Y: W$ [8 q* K" V) ]2 S filestream fs = new filestream(sourcepath, filemode.open, fileaccess.read);7 y( d* L8 ]/ e5 T8 i
byte[] bt = new byte[fs.length];
4 z" @. t, ~" k5 I1 w fs.read(bt, 0, bt.length);
7 q% C) {2 i! a5 ~& ? wc.uploaddata(targetpath, "put", bt);
: R/ Q4 p* `; d W$ n }" ]5 v3 X9 Z, {
#endregion) d# t/ `/ l4 w- |) e
webclient功能有限,特别是不能使用身份验证证书,这样,上传数据时候问题出现,现在许多站点都不会接受没有身份验证的上传文件。尽管可以给请求添加标题信息并检查相应中的标题信息,但这仅限于一般意义的检查,对于任何一个协议,webclient没有具体支持,。这是由于webclient是非常一般的类,可以使用任意协议发送请求和接受相应,它不能处理特定于任何协议的任何特性。
1 t' v2 N" ]# f更多技术文章信息请查看: 技术文章 |
|