这篇文章主要介绍了c# webclient类用法实例,本文讲解使用webclient下载文件、openwriter打开一个流使用指定的方法将数据写入到uri以及上传文件示例,需要的朋友可以参考下
; B) k' t) c: {) P. Z4 G8 B 进来的项目中要实现能够在windows service中调用指定项目的链接页面。由于访问页面时候使用的是ie浏览器或其他浏览器,所以想起用webclient类。
( v9 X/ D# T% P9 ` 如果只想从特定的uri请求文件,则使用webclient,它是最简单的.net类,它只用一两条命令执行基本操作,.net framework目前支持以http:、https和file:标识符开头的uri。* [3 b1 M) k+ V+ @" S" z
webclient下载文件6 h' }1 Z5 ~/ d5 \
使用webclient下载文件有两种方法,具体使用哪一种方法取决于文件内容的处理方式,如果只想把文件保存到磁盘上,使用downloadfile()方法,此方法有两个参数,即请求的uri和请求文件的的数据保存位置。, K! k3 B+ Q- i% h4 E( t$ F9 n
更常见的是,应用程序需要处理从web站点检索的数据,为此要用到openread方法,此方法返回一个stream对象,然后,可以stream对象从数据流提取到内存中。 G0 c0 {9 ^8 w" ^% V
示例:openread(string uri);
6 J i3 r4 Y4 c& n ?
5 V2 c" Q k8 z9 ^ 10 L8 t( X' i7 |* A; O
2
% u5 I4 L* F' _( h' n/ I 3
. T3 K! z' z5 Z9 d 4
, i0 u, J& H7 H) ~ 5
* o( j8 y5 K+ t- c% l6 s) O' R 6/ F; r4 _# p2 E& B. F H. Q$ h) b
7
" z9 r) X$ P/ m3 b$ l0 U 8& Z4 i, ~9 ~4 j1 Q( P4 ]3 {
91 E; C9 t \" m* P9 I
104 [# Q. B5 O( G. ~1 T. @
11
$ `) g* H A* ]3 P/ J 12
2 E I: Q- O) e: T6 Y. Q6 Z 13
! i8 G2 b( w0 B4 Y4 J 14
& z# m |/ O: e" T, O1 y 15
}) G" l" p/ l V, P 16, x! a0 ~- X# U2 D" K: [
179 a+ J$ w. A1 `: q6 ]4 s
183 I' p7 p& J6 }; d
19
S6 T& i$ [( L) Y6 w1 S 20( [1 e' ?: w2 \0 W
21openread(string uri)7 Z+ x, u4 }& T/ s$ _
#region 读取指定uri的html$ k% t5 ^" U: i9 d& C! a
///# [+ @0 |9 K! p, M; k
" s& x& e ]' [% Z3 ~; I
/// 读取指定uri的html
9 R& D: V$ o9 ~( c5 m5 ^' V! ` ///( M2 O4 h! Q" B: t9 z+ X
8 p7 k; Y" @3 N2 e
& G5 Z( i9 V4 V) v8 J: R ///" J! w/ _: f' t2 z+ ?9 q! f2 {- L2 g
///; P$ f, N7 m+ _ j' Y! j! y1 P
private void button4_click(object sender, eventargs e)
: [! \7 s2 _. ~/ o1 h) I {3 i) V- w% M/ T- K+ L W, n
webclient wc = new webclient();: O# i$ _; m$ Y( H U: u
string uri = "http://127.0.0.1/rss/sina.aspx";9 i2 z$ b* v% a, N: h( q8 o
stream stream = wc.openread(uri);
& j. i. O' K7 V' M) Q* h l streamreader sr = new streamreader(stream);
' b$ x/ L% Q# h string strline = "";
8 [# }! m0 W1 m" M8 { while ((strline = sr.readline()) != null)0 ^7 }# E, q3 }& v
{9 ^; z/ z1 S0 g+ m
this.listbox1.items.add(strline);0 q- M7 ], H9 b; t# C
}
5 P6 {& F) a8 ^1 m sr.close();
+ T9 u' J; J! A6 ~- N% R" c }* v1 p. @* D, u' @+ s) x X
#endregion
% [& U& }! `% w" x, J' e- z 示例:openwriter(string uri,string method);$ }, Y+ i, j" [% M
?. K' x! h! `; _ N3 \& q
1
0 |; l- m: E4 V9 H 2$ y5 {! S* V: b) O5 b& f
3" n* p5 W C a3 G: ~
4) t: t$ B) T5 P. E" q
5
) `! e. a: y9 v" I$ ]* i6 e5 s 6$ x1 g* J0 I7 C9 _/ o4 D$ X8 k- R1 [
7
0 W: p' W6 R3 ~# P* n. |2 e6 ~6 y* w 83 p$ i% {4 O! q3 I. R7 z1 k
9
* J+ i, |/ Y# W7 [ 10
0 ]4 ^/ x$ P5 F. a/ v% L 113 x# X- T5 G/ q
12$ x/ s6 B/ `; R& M2 ~4 q0 h
13- q8 }% X2 B3 b
14
4 ?+ ^8 q9 Q4 A9 O& P+ p 15- S5 M7 ^0 ^- q5 e+ A" V
163 G# [4 f, ?* O3 x1 m
17$ m2 F0 o% q3 |& L( k8 E
18/ T$ I/ O) l1 z, X" W; E# E2 Z
19openwriter(string uri,string method)
& v# X. g: M9 l3 b+ q1 L0 z) A #region 打开一个流使用指定的方法将数据写入到uri, X& G2 R) Q" H5 E( o( |) l+ S U: D
///
8 V4 T# `1 X, f# i7 R
3 p3 T4 D' N U; i( H) g1 d' a* | /// 打开一个流使用指定的方法将数据写入到uri9 L( W1 u+ x2 K/ ]/ K, o; `
///6 c% `+ X. b" J" c" N7 E
* s: F- @: i4 _8 o, ~( o9 s
9 |( u( Y+ A; [1 D1 _ ///( R% ? V5 D: |! p/ i
///
: E+ f; z2 P! j# u6 E/ ]" ? private void button1_click(object sender, eventargs e)
7 C1 B7 L: u/ A+ _& L {
) }: ]2 ~. l* H( D' v, V% R4 J webclient wc = new webclient();9 l/ T! _; R+ q$ ~4 h
string uri = "http://192.168.0.35/cims30/rss.txt";8 |% `# c2 e2 l
stream stream = wc.openwrite(uri, "put");
% A- W R8 _* W j streamwriter sw = new streamwriter(stream);
3 q$ v1 P! J' D7 T: i sw.writeline("helloworldhelloworldhelloworldhelloworld");
% [! ~9 Z9 x+ \; [* O. b1 ^ sw.flush();# `% Y$ ^& u: q2 a; n
sw.close();! X5 E3 R, s0 L' {( U
messagebox.show("ok");. c1 ^5 o4 ^' a2 C4 Z. N8 Y
}
. i" V0 U7 Q6 k4 b7 |8 k* V #endregion' \) {1 w' P, e5 V$ h' U
openwriter方法返回一个可写的数据流,便于用户把数据发送给uri,可以指定用户把数据发送给主机的方法,默认是post,上例假定0.35的服务器上有一个可写的目录刺马s,这段代码是在该目录下创建rss.txt文件,其内容为“helloworldhelloworldhelloworldhelloworld”
" z6 E: h2 I/ V% n) T 上传文件, L7 ~% i+ z8 {, G( j+ T
webclient类提供了uploadfile()和uploaddata()方法,在需要投递html窗体或上传整个文件时候,就可以使用这两个方法。uploadfile()方法把文件上传到指定的位置,其中文件名字已经给出,uploaddata()方法把字节数组提供的二进制数据上传到指定的uri;" j" F3 Y0 g3 J
示例:上传文件
p% ?( U+ x: Y, i. {3 k$ O% M ?
5 u# S+ O3 E0 m; h: G- t #region 把本地文件上传到指定uri
7 n0 o i E& y ///5 h. K) o& ?$ r3 K
9 Z, f9 {7 {" y
/// 把本地文件上传到指定uri
- j. U$ o+ ~) m" N9 y) { D3 N ///
/ O- P: |: l' I' D+ X3 }1 g" Z4 W. y6 U& C6 G2 B
; n* Y1 ~5 }8 B3 N* M3 E) m
///
3 D C0 F6 i m1 K/ ]% j7 C ///( j! Z5 _; o& f/ c2 _) q+ d
private void button2_click(object sender, eventargs e)
' [4 {4 r/ q. c# I; B* K* B {- [6 u, b4 W& j+ d% b& w4 L7 H* C
webclient wc = new webclient();9 K4 B+ K( z* Z9 z& I) Q. y
string targetpath = "http://127.0.0.1/rss/data configuration.zip";
+ o( C# M( H2 f z string sourcepath = "d:\\data configuration.zip";. w/ F4 p7 |1 z- A% m7 l' @
this.label1.text = string.format("uploading {0} to {1}", targetpath, sourcepath);
6 F7 e @7 D$ v7 U byte[] bt = wc.uploadfile(targetpath, "put", sourcepath);3 p) y' h6 s# Q1 Z
messagebox.show("ok");
& H1 ]* j! _, B# P& H }( Q+ o; w, i, w1 J7 D4 h
#endregion% l& I) u; @2 ^* s" G& q5 e
#region 把数据缓冲区上载到指定资源
9 W" Z9 e2 S' h Y7 |7 H7 Q1 { ///
# q5 }4 l0 i* F
( z7 C- d- E6 u& c! d4 i: w: r /// 把数据缓冲区上载到指定资源; ^! x+ K% [ J# _/ @' b( N5 a
///
" H3 j5 S: i) x. g6 k; y J: h
' ~9 z2 Y* n' Z& \8 J+ O) O% g
///, ^- s2 H/ t& y
///
8 @1 [6 x" s. ?8 v private void button3_click(object sender, eventargs e)3 I) L# K4 p) I* {; l; o
{" ?4 I% o! V& z
webclient wc = new webclient();/ V# P1 C! v# Y5 g2 n0 ?2 t9 B
string targetpath = "http://127.0.0.1/rss/kaifeng.jpg";4 T5 K' V5 J7 {% m$ e* ^
string sourcepath = @"c:\test.jpg";8 y9 s7 Q9 y9 H: x/ |
filestream fs = new filestream(sourcepath, filemode.open, fileaccess.read);3 a, R" h/ Y# B8 x) r" h0 P) z p+ K
byte[] bt = new byte[fs.length];
, }7 O8 t4 J1 n8 d; O fs.read(bt, 0, bt.length);
6 u3 \) P) x( B" Z4 b wc.uploaddata(targetpath, "put", bt);
! ^, f, R8 K4 ?4 n9 e1 X }
8 m& H: e: c# x; d9 s& z- X #endregion
2 H7 X( n5 ^2 N( X9 ?1 O webclient功能有限,特别是不能使用身份验证证书,这样,上传数据时候问题出现,现在许多站点都不会接受没有身份验证的上传文件。尽管可以给请求添加标题信息并检查相应中的标题信息,但这仅限于一般意义的检查,对于任何一个协议,webclient没有具体支持,。这是由于webclient是非常一般的类,可以使用任意协议发送请求和接受相应,它不能处理特定于任何协议的任何特性。
) F$ w1 Q6 x1 V9 W+ T更多技术文章信息请查看: 技术文章 |
|