这篇文章主要介绍了c# webclient类用法实例,本文讲解使用webclient下载文件、openwriter打开一个流使用指定的方法将数据写入到uri以及上传文件示例,需要的朋友可以参考下
6 h1 B- y$ p( g* a( o 进来的项目中要实现能够在windows service中调用指定项目的链接页面。由于访问页面时候使用的是ie浏览器或其他浏览器,所以想起用webclient类。' j a+ F" j" i$ A! Q Y$ X5 _
如果只想从特定的uri请求文件,则使用webclient,它是最简单的.net类,它只用一两条命令执行基本操作,.net framework目前支持以http:、https和file:标识符开头的uri。
5 r+ c a; ?* g3 L4 Q0 D webclient下载文件
$ I3 w) l6 X U$ k5 a 使用webclient下载文件有两种方法,具体使用哪一种方法取决于文件内容的处理方式,如果只想把文件保存到磁盘上,使用downloadfile()方法,此方法有两个参数,即请求的uri和请求文件的的数据保存位置。+ ?+ U+ U+ M% O
更常见的是,应用程序需要处理从web站点检索的数据,为此要用到openread方法,此方法返回一个stream对象,然后,可以stream对象从数据流提取到内存中。+ l0 ]( `! H" T. h" h, U* z/ p2 z
示例:openread(string uri); _0 y2 A e5 @1 h) l+ h
?6 V' C! q$ z! l# Y$ i4 w. ?) }, e
1
! t* u" d- k+ T7 f" s 2
: d% \. I4 Z1 m/ s2 |( I$ U 3% |7 ^$ p' i5 H- o5 v- X
4
1 i$ n" o/ M6 F 5
Z- o6 V5 g' U6 @ 6
8 `. Q9 e: E* k( D. w, L& K' t: B 7
' u# m1 Y" ~: f& Y' P. B( \8 ]. C: v 8
+ x, p4 S4 e0 B6 ` 90 ~, S. s' R) l
10
- P" b9 E" s9 M1 j8 G 11# d$ g: @" y9 J9 c1 U2 i' m
12
9 ^! g( u' j7 [$ e. f3 A2 J 13, u" l! ]& ?0 X
14
' h) }5 n* h. h 15
$ z* K' K! }7 Z# u3 I0 X, r 16, L) {3 r0 ~1 V; Z: M8 r5 n* E6 v
17- v- [& @" l! A! n9 x, n1 ~
18
* y1 ^ l4 m6 M2 R. s; c 19, B1 R: g7 k4 p! M
20
2 S0 V2 l! K0 |$ K. q5 n" H 21openread(string uri)
) t8 V# t) Y8 U3 ~ #region 读取指定uri的html+ Y$ z; i1 E2 d: q2 A7 P
/// S, m% H5 J# `, m2 O
4 |- \5 X) J8 ~
/// 读取指定uri的html) V$ F7 q$ D4 }. O6 `
///5 @5 \9 S! e+ ~4 W' ]
1 F. m) p3 B0 {; O: m 6 i9 K' E1 i8 Q' I2 m- S# a
///$ k3 Q8 }2 S- I% w( B8 H4 X
///
7 Y" z, A, A4 ]4 R' d private void button4_click(object sender, eventargs e)( P( ]0 U! X1 ^. B5 l$ [% I
{% o. r1 M8 f: r0 {0 \
webclient wc = new webclient();
- q& t; ~7 c- p5 f+ E string uri = "http://127.0.0.1/rss/sina.aspx";4 X; V' V% l2 T& N0 X
stream stream = wc.openread(uri);7 h) z6 g& e/ j* c2 V' _7 x# K
streamreader sr = new streamreader(stream);
/ C9 Y& m% h8 r5 Z! K string strline = "";( o' y, i3 Z6 w2 c5 X2 A% [; |
while ((strline = sr.readline()) != null)3 O8 k% L' M6 y- C
{9 D4 z9 W f) u/ F
this.listbox1.items.add(strline);( e1 o2 R' w! B3 \1 E) Q9 J8 M& K
}
( Y. l1 ]7 T6 L1 {( l& A sr.close();' i6 F9 g: A# `) L9 x
}6 x4 w5 h) Y; i- J6 Y2 ]7 Y
#endregion, T" D' J+ v: W1 x
示例:openwriter(string uri,string method);: d/ V7 w+ o4 I2 W, U
?
: T* j9 Y. G! { 1
- @ T3 [/ }5 ]: S( c 2
" `5 r6 T$ H# { 3
, l3 C0 E5 `/ o3 _ 4
! M2 g7 M5 O5 ~% H7 \ 5
4 t8 e7 d% a8 x a 6
5 v; D6 [2 X1 ^ W 7
% s4 A+ w5 r7 S/ `6 C8 t2 P. h2 H 8
! {8 J' T4 X" y( M" N, R7 Y 9
3 T: @( J' v J- G' | 10
' H6 E$ e- M3 t5 @% w 119 u* ~3 `1 r/ n
12$ z& f. I' |& \# C
13
( N; V6 J4 r/ }! z; M7 w9 }. @' } 14
( w" _) x# x) J O. c( x" M1 k& n6 z! P; E 153 }; h; N8 v! I, R' X! W
169 h- o1 z# F2 f$ [$ R& ^, o; G
174 B) z0 Q4 N p) b
18
+ d2 a2 u" R, O# H8 L. b 19openwriter(string uri,string method)
0 m2 r, n( |9 q: o! f# m$ c$ y1 t) k #region 打开一个流使用指定的方法将数据写入到uri- A+ n( d# x3 S6 r
///
: [6 n8 S: z0 G1 l# |6 A' a 9 q$ Q1 ^( E7 V5 G
/// 打开一个流使用指定的方法将数据写入到uri! f, g$ U* W8 C1 M/ w
///
, N* B; j4 I. v- w' W0 P/ F/ w9 d8 y( D$ ^! C/ Y" J# ] G% a4 D
% G( F; _+ k4 l5 A" x& k2 V. A; B
///7 X9 c- G1 F3 g) j& n4 H7 n8 A. q
///6 L) \; z- c0 ?+ G/ e1 N; ]+ M
private void button1_click(object sender, eventargs e)
r, W" h5 _0 t2 S+ q {, w: @6 B. X8 e4 ~8 }0 l
webclient wc = new webclient();
2 j( v0 q' u6 J n% n w string uri = "http://192.168.0.35/cims30/rss.txt";" s# E+ ~4 z7 i( _4 A. u1 |
stream stream = wc.openwrite(uri, "put");5 g- ^0 B1 L7 Q9 v1 T
streamwriter sw = new streamwriter(stream);- n" C8 b# i9 Q* b
sw.writeline("helloworldhelloworldhelloworldhelloworld");
) m. G* b! u" s Y" ^ B$ J7 R sw.flush();+ X* `. P- a1 F% L2 a: e$ |& }8 z7 G
sw.close();* f$ D6 V. W* ?& o1 O
messagebox.show("ok");+ ?* g+ n) e c* T1 Z3 i* U
}
1 B$ ~" d7 D4 q3 d& d8 ] #endregion
$ W: A& N' V* N2 P6 p openwriter方法返回一个可写的数据流,便于用户把数据发送给uri,可以指定用户把数据发送给主机的方法,默认是post,上例假定0.35的服务器上有一个可写的目录刺马s,这段代码是在该目录下创建rss.txt文件,其内容为“helloworldhelloworldhelloworldhelloworld”
% R4 ^& D) ~" Q& a% d 上传文件
& k) `/ t% ~9 V* }8 z7 r webclient类提供了uploadfile()和uploaddata()方法,在需要投递html窗体或上传整个文件时候,就可以使用这两个方法。uploadfile()方法把文件上传到指定的位置,其中文件名字已经给出,uploaddata()方法把字节数组提供的二进制数据上传到指定的uri;
4 a# A) Z; f* m2 y8 N* @; N) T4 r 示例:上传文件
) [ M: I' R2 c; [8 x1 e9 g ?' s5 z* O7 B0 k1 j. y* h; I/ q; m3 R
#region 把本地文件上传到指定uri$ A6 s" n# _! p
///
, l) L# N( u7 l$ }
6 S; j7 g9 ~# y- g- {& ^ ]) c* r /// 把本地文件上传到指定uri
) x0 I! R3 m6 N0 e9 m" J( `3 P7 c ///( r( p8 `8 k8 J. W( q9 V
% e6 P I3 R3 \! w0 l' }
# Z5 a! U, {0 L ///
4 g J9 G8 ]5 E& F$ _ ///' E& V2 K V# @5 o' ^' m) h) D
private void button2_click(object sender, eventargs e)
; E% d. D/ M5 K. z0 Z! d" }1 J9 J {# i) q7 L% F/ o- D6 ?
webclient wc = new webclient();
+ E5 b* d: z1 q- |# [8 T# d string targetpath = "http://127.0.0.1/rss/data configuration.zip";
8 j9 x7 `5 ?( O- ~- m string sourcepath = "d:\\data configuration.zip";
" S# G. ]9 U7 h this.label1.text = string.format("uploading {0} to {1}", targetpath, sourcepath);1 H7 |. W: X$ ~, G0 u9 T4 o" Q# H
byte[] bt = wc.uploadfile(targetpath, "put", sourcepath);
% U# O( ?; ~( s% M; ]0 X messagebox.show("ok");# ] B+ N) t. }* K7 E
}( v$ M2 M+ r: H" y- n
#endregion# ?( r& K+ Y1 R& N
#region 把数据缓冲区上载到指定资源
4 |8 p6 d5 n8 F& \ ///
$ f" w9 k: a8 z
6 s$ |+ c: {+ V, v /// 把数据缓冲区上载到指定资源
. K+ |9 f8 i& K0 |- a) F% U ///
4 @! q5 o; b2 s$ f. j" Z
/ _5 e0 D' n1 V7 q( O. l; _% U7 Z : e' W+ t: ^( ?# f
///
- j8 @1 t* }, f( c8 g( y ///
3 l y# U3 V j- h private void button3_click(object sender, eventargs e)! j- K+ J; n4 A4 C" c0 F
{0 n5 h7 F! l: @6 ]. M
webclient wc = new webclient();
' P9 a1 N5 v6 }/ e+ [1 D' O: o string targetpath = "http://127.0.0.1/rss/kaifeng.jpg";+ v% i A5 ~- Z; \4 |* J3 H. ~& N1 W
string sourcepath = @"c:\test.jpg";
" U( @/ K- [* S. k7 p filestream fs = new filestream(sourcepath, filemode.open, fileaccess.read);1 _# }# f+ t5 B0 B
byte[] bt = new byte[fs.length];
4 E( s; ]2 a+ f2 E1 m- n1 k fs.read(bt, 0, bt.length);; k+ A0 r3 e& q* d6 E
wc.uploaddata(targetpath, "put", bt);3 _3 Q" d+ E6 {+ S2 T, g* s
}
0 S/ F. `% |& A. l6 k7 v #endregion
9 d$ F. X# Q; e3 p- l" G U$ D webclient功能有限,特别是不能使用身份验证证书,这样,上传数据时候问题出现,现在许多站点都不会接受没有身份验证的上传文件。尽管可以给请求添加标题信息并检查相应中的标题信息,但这仅限于一般意义的检查,对于任何一个协议,webclient没有具体支持,。这是由于webclient是非常一般的类,可以使用任意协议发送请求和接受相应,它不能处理特定于任何协议的任何特性。
$ o5 b, r( C( |3 t- k& [) ]更多技术文章信息请查看: 技术文章 |
|