这篇文章主要介绍了c# webclient类用法实例,本文讲解使用webclient下载文件、openwriter打开一个流使用指定的方法将数据写入到uri以及上传文件示例,需要的朋友可以参考下9 b7 V2 q+ b( V
进来的项目中要实现能够在windows service中调用指定项目的链接页面。由于访问页面时候使用的是ie浏览器或其他浏览器,所以想起用webclient类。$ D8 n5 M% ^5 I( L9 g' W% m
如果只想从特定的uri请求文件,则使用webclient,它是最简单的.net类,它只用一两条命令执行基本操作,.net framework目前支持以http:、https和file:标识符开头的uri。
# \$ C. Q: M! U; ]6 R2 p- Y webclient下载文件
$ s$ [6 A$ H5 W, P+ x+ t5 o- u 使用webclient下载文件有两种方法,具体使用哪一种方法取决于文件内容的处理方式,如果只想把文件保存到磁盘上,使用downloadfile()方法,此方法有两个参数,即请求的uri和请求文件的的数据保存位置。
- w- M" ]1 A2 X 更常见的是,应用程序需要处理从web站点检索的数据,为此要用到openread方法,此方法返回一个stream对象,然后,可以stream对象从数据流提取到内存中。
) b0 A3 y0 Z B; | 示例:openread(string uri);
3 ~" C* j2 e# i) x! o% ^ ?
: x+ Z$ A" e: t; J4 n$ t1 p 15 R' b3 a4 O; q6 M/ X6 V* |
23 o3 K2 R0 t! V$ ~6 R
36 A! {( T3 p" p
4# f5 K2 Q. `" b% n- [2 v" u
5
* B% m9 z5 q5 h: h B 6' b/ e# l6 ]7 {2 @5 \& {
7# l* G6 o' h2 Q3 L+ i3 c
8
7 S" z& f2 n3 s- @3 {; y 9
" q1 X2 q/ H7 g% ?& }' Y7 R9 }! K 10
3 M" F% o% [0 X 11
! T* H6 t' V! P! a7 p 12
0 {6 z" F# d2 K) N& ~( g7 _ 13
: w0 r) ]. I. ?/ g 14* d8 U( i( {6 \+ L$ K) v
15
0 c6 i0 H. H# w" U- S 16* n6 ^; P3 W$ Y- Y3 {
17& U6 i: i3 `: o2 X
18
8 ]) [2 i. ^: |/ h 19" k: @& c2 d* Q$ Q- i; p) {0 M/ ?
20
) R" ?# ^, K2 ~& r1 o 21openread(string uri)
) ~% v' r5 j; `7 M5 L2 g #region 读取指定uri的html
$ s( K- q3 A6 B1 q3 ]& J1 w/ s ///4 U& p N! F* N9 w
; L5 l% u/ U& s6 l9 n( D /// 读取指定uri的html
8 p) f0 b7 t6 y6 p ///
1 H! [+ ~, c/ Q9 H! b; n. D9 B
- t! w* D' N5 L
5 u' h% H1 i# f" e$ k+ @9 D: E ///
* @1 ?( } j! i% ?3 q ///
0 j! u( O2 R1 e9 r$ ?7 D- d private void button4_click(object sender, eventargs e)7 A9 h5 [0 O+ ?5 |/ u, T4 T
{# z2 g5 o" s l; k2 p# i5 p% ]5 R
webclient wc = new webclient();
! ~. |. G& U+ s3 B3 v2 p4 ] string uri = "http://127.0.0.1/rss/sina.aspx";
) B0 t I6 z6 i4 Q9 y stream stream = wc.openread(uri);
: S9 K s |* M$ D& Q streamreader sr = new streamreader(stream);
: k% _ m p1 Y string strline = "";$ K5 [- w; r* ]3 w- Z
while ((strline = sr.readline()) != null)
" U3 C$ K, ^3 {: m' G" C6 ^4 b {% P$ f& J" i. H: O
this.listbox1.items.add(strline);
6 Z: a. E& G6 C ?' c0 ?+ ?: u( ? }
- f" E+ J+ J' ?* j- Y2 N* f sr.close();: ^5 n9 i# ^/ ~" p# p. K2 S
}& o$ \: q4 Z! K8 r K0 c" F
#endregion
$ h" M/ g) R$ E9 P4 W$ b, F 示例:openwriter(string uri,string method);; d$ l& l. L; g2 A
?
2 ~9 A" {4 a1 T* g% m 1: H" K0 k6 W8 D* T' n. v
20 }/ A# E+ d1 |/ x' q8 D
35 u9 u( C( B9 n( d* |
4
, V; p7 p9 T# }: C0 D0 V. x1 H; F' s8 z 5( F+ c3 Y: g2 l% W n' M
6
7 u. d% d4 l+ f% l1 Y! O+ w( m 7
" y! j9 w6 J" H 8
! d4 k( z* W' j$ T8 g$ X& X 9
" Q9 f' s5 Q3 Z0 M+ @9 Z 10
0 i+ j, ?1 \# g9 W 11
2 j: [" `. B. d0 g3 \ 12
/ E- n" s, P- e7 u$ B 132 p' X& O1 g5 w, b9 f! Z
14
" ~7 I# q4 k" H! y; s( k& ]0 t 15
/ h, |- U3 X3 v/ f1 h) o 16" {) U5 K! v& ~% \6 ?. U
179 ^" }8 N7 p8 t/ v
18
! U1 ]3 p' w1 c$ d0 k 19openwriter(string uri,string method)
3 A% ^& ^% _) z' p9 ]. d #region 打开一个流使用指定的方法将数据写入到uri
. B! @5 L% Q* k) h* o( @ ///
7 R& _" y) Y+ y! |7 s* L4 [
# }8 L- C: S) x& F6 h- k7 Q2 X0 j /// 打开一个流使用指定的方法将数据写入到uri" d" r8 k# ?( u& l6 r6 b
///
; c7 }( H6 ^; }: M# ^. n- A, Q, I, q1 O+ {. W
: f3 }! q( m/ J- h6 z6 J. M
///
3 \ }. c) b& ~) y. l; k9 d ///5 Q P* _+ P, V0 ?3 F
private void button1_click(object sender, eventargs e)7 @) Z0 X7 Z3 K. X# r' v
{
$ W- B0 B$ {' {! b/ d x webclient wc = new webclient();* Z: V+ F: K# W" F f* \
string uri = "http://192.168.0.35/cims30/rss.txt";
0 a: C- m- I% Z t" S6 V& v3 S stream stream = wc.openwrite(uri, "put");
# V- M" u9 D! z streamwriter sw = new streamwriter(stream);" e8 g5 h& M# U- { S' T$ S5 g
sw.writeline("helloworldhelloworldhelloworldhelloworld");+ A. O( Y: z9 t* M8 t6 \* d
sw.flush(); J9 T S+ M4 S i: D' ^5 D( P: U
sw.close();; o% u% |- A( w. w/ F% l
messagebox.show("ok");4 w$ F8 W' L8 g+ R: {
}7 z2 v; X* D% G2 V p. K- |+ ]) x) s
#endregion
& b. \1 e$ }$ Z1 h" P) O openwriter方法返回一个可写的数据流,便于用户把数据发送给uri,可以指定用户把数据发送给主机的方法,默认是post,上例假定0.35的服务器上有一个可写的目录刺马s,这段代码是在该目录下创建rss.txt文件,其内容为“helloworldhelloworldhelloworldhelloworld”
( j7 w- d" E/ x% k 上传文件
2 z- E! z d, a5 y" |. @2 H webclient类提供了uploadfile()和uploaddata()方法,在需要投递html窗体或上传整个文件时候,就可以使用这两个方法。uploadfile()方法把文件上传到指定的位置,其中文件名字已经给出,uploaddata()方法把字节数组提供的二进制数据上传到指定的uri;- v( v/ O/ y+ U5 J5 @7 t
示例:上传文件( h$ E; t( O% X( a
?
3 W6 M9 i) \% j( _( T; P! i8 ]1 M #region 把本地文件上传到指定uri
/ t8 v6 f8 L" M* J: X ///
6 R5 b4 \1 q: G0 c9 i$ c- m, T% j) I , K- Q( E5 N& ?
/// 把本地文件上传到指定uri
6 @8 k1 ~. H, d ///: Q8 m5 z! } W
$ e3 g- V5 i) A8 @ 4 J: e2 @! Y. O9 I
///" X0 A% ?7 q. I( A( [# e
///8 q/ @$ E) y1 v
private void button2_click(object sender, eventargs e)
1 l9 } q. q0 ]3 h" y" A {
# p% ~$ r3 ]2 [ webclient wc = new webclient();; K$ S8 L! Z9 F" F, v
string targetpath = "http://127.0.0.1/rss/data configuration.zip";
2 L$ p6 L/ d0 V string sourcepath = "d:\\data configuration.zip";
+ ^# Z$ z7 _4 X( E" P" g7 e& E8 z$ W' ` this.label1.text = string.format("uploading {0} to {1}", targetpath, sourcepath); G4 q, z) o: `0 {; s# E0 C
byte[] bt = wc.uploadfile(targetpath, "put", sourcepath);0 J- C$ R! g3 z; c: j8 o$ g8 w
messagebox.show("ok");; p, N4 w# j! F4 v9 e$ G8 [
}6 G7 s9 r D2 Y) `; m9 a
#endregion. I w v3 |) }$ o7 {4 `
#region 把数据缓冲区上载到指定资源% C# |( D: k# d! i+ A/ }
///
. Y7 r/ e) r& y; v0 G& m 7 S4 h7 c7 Z4 e. f
/// 把数据缓冲区上载到指定资源
4 n+ ^, x9 P# I# w/ D& l ///$ ~# l& S1 K& p" \8 U! u
/ K! X7 R$ N% @6 R: | R 0 B7 z$ E {" a
///
0 F0 ^8 p; f$ s' r9 a* ]' }3 r ///& ?, e+ k7 t( F& N K$ a
private void button3_click(object sender, eventargs e)7 E( h# l4 F/ C- }) F
{
+ s! |2 }, T% C. z2 t1 Q webclient wc = new webclient();
5 ^1 q( l1 S/ U. [: x$ ^ string targetpath = "http://127.0.0.1/rss/kaifeng.jpg";5 I, R2 S6 q3 ^8 @) D/ [
string sourcepath = @"c:\test.jpg";
9 i/ _$ `, ]* {5 ` filestream fs = new filestream(sourcepath, filemode.open, fileaccess.read);
( Y& Q& z5 r# m( N7 a3 ]! R2 A. Q0 b byte[] bt = new byte[fs.length];" `: G: r% k& R! r% Y8 K
fs.read(bt, 0, bt.length);
* Q9 M+ B4 G2 L3 Z4 ] wc.uploaddata(targetpath, "put", bt);6 _# C8 Y$ [$ V: e
}& u# ]0 l4 I. N4 R
#endregion0 R8 c/ U& l/ X8 e4 P$ H; @* E
webclient功能有限,特别是不能使用身份验证证书,这样,上传数据时候问题出现,现在许多站点都不会接受没有身份验证的上传文件。尽管可以给请求添加标题信息并检查相应中的标题信息,但这仅限于一般意义的检查,对于任何一个协议,webclient没有具体支持,。这是由于webclient是非常一般的类,可以使用任意协议发送请求和接受相应,它不能处理特定于任何协议的任何特性。
! U u' Q; A& L7 w! {; a# Z# r更多技术文章信息请查看: 技术文章 |
|