这篇文章主要介绍了c# webclient类用法实例,本文讲解使用webclient下载文件、openwriter打开一个流使用指定的方法将数据写入到uri以及上传文件示例,需要的朋友可以参考下
, E$ w& j, m, U& f/ d3 u6 X( Q 进来的项目中要实现能够在windows service中调用指定项目的链接页面。由于访问页面时候使用的是ie浏览器或其他浏览器,所以想起用webclient类。 ]% v, ~" T1 D/ r. I! _* d! r& y
如果只想从特定的uri请求文件,则使用webclient,它是最简单的.net类,它只用一两条命令执行基本操作,.net framework目前支持以http:、https和file:标识符开头的uri。
; i* C! o4 b1 s7 g webclient下载文件9 }9 W6 }8 w ?1 I
使用webclient下载文件有两种方法,具体使用哪一种方法取决于文件内容的处理方式,如果只想把文件保存到磁盘上,使用downloadfile()方法,此方法有两个参数,即请求的uri和请求文件的的数据保存位置。. t+ I2 z% |# |* y
更常见的是,应用程序需要处理从web站点检索的数据,为此要用到openread方法,此方法返回一个stream对象,然后,可以stream对象从数据流提取到内存中。
9 Y% N6 H6 }) m6 `3 i. M+ P 示例:openread(string uri);
- Z5 J$ x0 N3 L- \! i$ z7 B6 X ?
( [. f' H: k9 L. c1 [5 d# b 11 B n( k& h6 T/ K% @# T
2
0 m" E" S5 o$ {3 z& M 3
# h3 T0 V) c$ L/ a* f/ ]8 x+ f6 M 4
) w% B4 B" I3 ?0 n8 P 5
/ t6 Y7 ~- R9 y4 r, k- w; T% M 6
% `* L/ {. Y: ~8 s- Y, n- W 7
+ |% h' [" H; |3 m- E9 v 86 K( Q4 v$ H+ }: g/ W A( p4 X8 w
9
% q# l9 z- z: R8 j2 h5 k; y 10+ K7 [( ?; o0 p/ B9 \
11* h& U$ B2 W9 u u
12$ I- z& ~/ m$ A; J- u
13
8 i- W, g' M, L' u Q2 m 143 v! j$ z- X4 p
15
; Z" [0 y; U5 o1 m, @" {& D9 {! n 16, I' K/ f0 C* e* Q9 ?
173 [6 U8 R0 i0 G; c- {
188 ]. N* X" s& V! G. V7 {- N
190 U0 H/ a2 @0 q' {' n
20! ?# C) ?" f$ ?9 J# ?
21openread(string uri)
/ v/ P* V* f. s/ `4 `; O #region 读取指定uri的html2 z5 W" S0 C2 i6 H9 m3 j- Y
///
Y2 V; O8 P/ T3 \# Y0 G
( p/ M: C7 d7 \8 h /// 读取指定uri的html
9 M# w q- Z( \6 J$ _. y ///
+ n7 j0 X7 T/ k Y$ w. G; L7 w& @
, _8 i U! |8 {2 f 7 R/ W. ?+ G( _& U$ R6 x6 s
///
) A' j. Q# p) y Y# T7 T0 M ///& z9 h. z9 F( U" ?1 d3 m, A8 p5 N* Y
private void button4_click(object sender, eventargs e)
' V0 ~, X, e- _5 m# G6 \8 w {% r/ m4 q5 k6 S
webclient wc = new webclient();5 e- \5 E" `: [" Z% q& |0 P
string uri = "http://127.0.0.1/rss/sina.aspx";0 v* A# m. i4 V
stream stream = wc.openread(uri);
& _& c9 V. Y: a streamreader sr = new streamreader(stream);; F& P8 y `9 `5 l
string strline = "";( k* |; Q6 H2 V. m
while ((strline = sr.readline()) != null)
! C) O6 |- E# i) N: J% ], b {3 K2 R- ~3 P( I( c% Q" q! q% e5 L- Z/ {
this.listbox1.items.add(strline);
) u2 X" [, X% k. G& _8 J }
, i1 `. D& {0 q0 B+ l; { sr.close();
7 H \' C$ S4 R& ` ~+ N }# L; [3 ^' I" q+ ?
#endregion! K" N# N1 ^. R/ {, k0 i9 d4 X, I
示例:openwriter(string uri,string method);
# }( z, Q8 I2 I1 q) i; h ?9 N7 l+ z5 @0 R( K& I
1
( g+ K8 [0 b, h( c 2
$ \( I$ U+ T4 r4 T0 r' \ 37 D9 r/ A5 P6 R: o* h/ h
4
$ V0 w' @2 f. D" j, ~, q 5
+ C5 R6 z/ {8 r2 P. q7 C" n- |1 Z 6- p" Z3 e' u) B J% c, t$ _
7, {! R+ i9 g6 f" T( D
8! P i, @0 H6 y, N7 h. `% O
91 N9 x( l0 `6 t3 _' m
10
# R" Q+ A- R3 B2 N 11& A' q3 N7 o! l" D$ {0 O+ z' H9 [: C
12' K% t$ n* K! I; e9 K
13
( a2 o* H8 [# `, A9 H 142 T% c/ W9 H; T" X* N# i2 a7 w Y
15
$ H$ n& G: p6 q2 i4 M: G( Q 16
, q) { d+ C6 e" w: b' a 17$ `' y( N* {( V! s+ l. f
18$ r3 u2 X4 c# P9 i& N) O' p
19openwriter(string uri,string method)/ l( }$ A, t# n5 R( `- p
#region 打开一个流使用指定的方法将数据写入到uri
7 ~3 N6 q1 O8 f2 h ///9 g* {' x6 H) N3 U) g$ z. Y
* x( n, D, |5 n5 v. `
/// 打开一个流使用指定的方法将数据写入到uri( H- q8 J% W/ e+ m
///+ S; E" m T) Z: f
' d7 N4 I8 w2 n3 C: G
P" } y* L3 M ///. [0 i2 f6 y' U# M! E4 q
///
4 W# J: G! t! m/ k private void button1_click(object sender, eventargs e)
$ s X# E2 k4 s {/ c3 r0 m% e0 Y, y0 R' t% q1 ]
webclient wc = new webclient();
2 _# o4 K' Z) l7 Q9 c( O string uri = "http://192.168.0.35/cims30/rss.txt";. k& N, B$ ~" T% u
stream stream = wc.openwrite(uri, "put");
% b$ E4 b3 o, ], D4 [ streamwriter sw = new streamwriter(stream);! Z+ Z1 M' D0 v3 N; F1 q6 Y
sw.writeline("helloworldhelloworldhelloworldhelloworld");# O! \$ S3 k8 K3 c: c9 i5 Q0 }
sw.flush();
+ y, _7 D/ F7 C! E, ? sw.close();
. Y. d3 ]- Q1 s* W messagebox.show("ok");
$ m* J" K) K W; D" w# l" c1 w. A2 } }
- Z" V) w* i+ K4 `2 s #endregion
+ N8 N; Q n5 I6 Z1 P9 O openwriter方法返回一个可写的数据流,便于用户把数据发送给uri,可以指定用户把数据发送给主机的方法,默认是post,上例假定0.35的服务器上有一个可写的目录刺马s,这段代码是在该目录下创建rss.txt文件,其内容为“helloworldhelloworldhelloworldhelloworld”1 i3 H' y; X) I; g/ l: A
上传文件
% x, S. M- P# \6 q) B/ x webclient类提供了uploadfile()和uploaddata()方法,在需要投递html窗体或上传整个文件时候,就可以使用这两个方法。uploadfile()方法把文件上传到指定的位置,其中文件名字已经给出,uploaddata()方法把字节数组提供的二进制数据上传到指定的uri;
4 K0 d/ r, C- ~. d! c 示例:上传文件. O$ ]7 d) V( u8 \
?
+ k$ F Q! R' x, E8 H+ L) { #region 把本地文件上传到指定uri: }8 P+ T6 v! e* i
///1 M3 g$ p: a" P# G/ q
# A. l* q6 b9 t& O H7 O /// 把本地文件上传到指定uri; s1 B6 t; B6 q$ x% m
///
& E3 l: u# \& u' U% g4 f" k( `; ]! U5 p B0 W5 @% C
' @" q8 y, t( K. N: G ///
8 D9 e5 U; @( p+ Y; a" B ///
% s/ F, l4 q; Y' s private void button2_click(object sender, eventargs e)1 }; C. B& n% W" i, ?
{
6 Q! l5 s( n% B- }- c webclient wc = new webclient(); K. g$ T$ Z& a8 b3 Y, ]: u
string targetpath = "http://127.0.0.1/rss/data configuration.zip";# C. x% j1 p$ s$ Z! W( r3 {% f2 H
string sourcepath = "d:\\data configuration.zip";* C' g1 Q( l- l$ N
this.label1.text = string.format("uploading {0} to {1}", targetpath, sourcepath);
/ f$ L- ]4 T* r* E7 O0 C byte[] bt = wc.uploadfile(targetpath, "put", sourcepath);; b# \. ]) j1 ~6 E+ A9 |7 P
messagebox.show("ok");
' {6 x- u4 I# N; r; v+ G }8 }* f" j1 A& Z' W
#endregion3 {! q9 a5 t, h) H8 X
#region 把数据缓冲区上载到指定资源
: Y1 p& M p: e J6 e2 A5 I ///6 _$ m) h1 ^+ s* e9 t
3 o: d; g- @' p; B
/// 把数据缓冲区上载到指定资源. j5 W" m$ v4 J- u& h% j
///
5 T' _, j. J, e: u0 D) `9 A9 m7 J8 b1 l1 [
( |7 Z( _7 V+ v7 N' {5 ]
///
9 B+ _2 i: _1 p0 b0 x ///
7 d1 @2 U f# K8 s! R& G private void button3_click(object sender, eventargs e)3 @! E$ N x: M3 o3 Z9 K8 D, l0 o; X
{* s+ i! J* G0 ?' E" Q5 T
webclient wc = new webclient();
3 a1 t, s' ] z( y( ?3 x; d' g: [ string targetpath = "http://127.0.0.1/rss/kaifeng.jpg";6 m4 q# l. a: ~# ^
string sourcepath = @"c:\test.jpg";
4 |8 V R7 x8 e! m' _ filestream fs = new filestream(sourcepath, filemode.open, fileaccess.read);
) L. s& C+ m, o- q+ W& s byte[] bt = new byte[fs.length];
- Y7 [+ s: Y! n7 A U3 p fs.read(bt, 0, bt.length);0 u/ I, A; m' d4 g" ~1 v1 F2 |0 V
wc.uploaddata(targetpath, "put", bt); c6 W9 R+ X! \3 P; J. ]
}* L% @5 X$ K, ]1 H7 C, @/ r
#endregion
+ j' }; c8 [( ~: |# m# K webclient功能有限,特别是不能使用身份验证证书,这样,上传数据时候问题出现,现在许多站点都不会接受没有身份验证的上传文件。尽管可以给请求添加标题信息并检查相应中的标题信息,但这仅限于一般意义的检查,对于任何一个协议,webclient没有具体支持,。这是由于webclient是非常一般的类,可以使用任意协议发送请求和接受相应,它不能处理特定于任何协议的任何特性。2 V8 R ]6 Q% A1 V1 _5 T2 R
更多技术文章信息请查看: 技术文章 |
|