这篇文章主要介绍了c# webclient类用法实例,本文讲解使用webclient下载文件、openwriter打开一个流使用指定的方法将数据写入到uri以及上传文件示例,需要的朋友可以参考下$ [& I# B' e* c% x/ j: Y- j
进来的项目中要实现能够在windows service中调用指定项目的链接页面。由于访问页面时候使用的是ie浏览器或其他浏览器,所以想起用webclient类。
/ e1 n* E# k1 l, I d8 ^ 如果只想从特定的uri请求文件,则使用webclient,它是最简单的.net类,它只用一两条命令执行基本操作,.net framework目前支持以http:、https和file:标识符开头的uri。
6 m) k! x( Z9 Z0 d: y! {5 J webclient下载文件$ h( H0 S9 e) P
使用webclient下载文件有两种方法,具体使用哪一种方法取决于文件内容的处理方式,如果只想把文件保存到磁盘上,使用downloadfile()方法,此方法有两个参数,即请求的uri和请求文件的的数据保存位置。
0 U+ j5 [- E! Y# o 更常见的是,应用程序需要处理从web站点检索的数据,为此要用到openread方法,此方法返回一个stream对象,然后,可以stream对象从数据流提取到内存中。
( t; a0 ?5 c+ ^/ O 示例:openread(string uri);
3 C: S8 l1 j, @1 T) `4 Z ?
/ F: b$ G: N8 m- R 1; `! E: d1 U$ W: k7 Z) x
2
8 @$ o0 n. n" I% @! s 3
% P$ j s- I4 s+ D& \- @1 L5 w6 y) B 4: T" ` b" n* k$ ?
5
* U7 u8 h2 k9 O6 J7 c$ i' s! p4 M 6
9 T0 Y/ y- E# f4 o 7
& i2 a6 v- r- S1 k- x/ J$ Z 8& z9 |# [5 J7 h G+ f# r: u' t
9, J/ T. J' {. M, i; y
10- p) [! D- m$ ^ V/ Y* w
11; ]' g7 w! P9 a* T
12
3 A1 a4 O) q. | 13 j4 p+ b! S C
14
) _8 w2 f7 E4 Z( u2 i& n 15& Y; v4 p |, x
16! e8 K+ n) a, u0 {5 j: L( {: y
17% K1 B& i3 P( g7 i
18, f2 {! G f1 K4 L0 x
19
5 J) X5 ^& U, J- h# x, @/ U. A' t( s 20
5 ^) L0 l) M+ `: W 21openread(string uri)
' f) q1 V9 m5 ~, r0 c) R #region 读取指定uri的html4 y' I6 H- r4 o) C
///
, W* d" }: o" x! j
8 S: ^5 T+ ~/ p+ l0 q /// 读取指定uri的html
% Y& b& d( R8 q0 E- g ///& a# H% j( g/ ], u) Z* g+ X' {6 w
) Y, m* |7 k4 W7 G7 W5 E: }
/ y: ^1 m* Q: [8 w8 A" |& L* l! Y; S" O ///
' t& @" ^: O3 M, r* k% R ///2 P$ y* q- g; b: A. A
private void button4_click(object sender, eventargs e) P! i4 ]: o. u2 T) p
{
, U. t" d) W3 h7 y; x& V% y1 r9 q G2 u webclient wc = new webclient();' @% M) @# B( K" i$ n1 Q, j5 v
string uri = "http://127.0.0.1/rss/sina.aspx";4 Z! C* J: J, _. f8 j
stream stream = wc.openread(uri);/ C7 h4 U4 d r" R
streamreader sr = new streamreader(stream);' \& J' {1 |" e! G8 I. n: T
string strline = "";
/ w! d X: X) ?* e1 }9 \# @, S while ((strline = sr.readline()) != null)
; g1 d3 G. x- m( t, `* u- I1 R {; @' t7 a( x3 ~/ q8 C6 I$ v9 f
this.listbox1.items.add(strline);
+ i6 \, E+ P8 D8 Z }3 ~9 Z8 P7 U( w+ `! H" ^, |$ ^1 |
sr.close();
, V4 v- ]* R! Y3 W$ g# `, J, k }
. _7 |) [, _( B6 t. { #endregion7 k" U! P7 Z4 D4 F) E7 C! ~
示例:openwriter(string uri,string method);
, f% j6 c5 l/ K8 j0 H- i( P! c$ }$ U ?1 M8 i- D7 F& _$ H" C* q! X/ {
1$ _; g$ t" s N1 d
2: G7 J5 e3 E N# P- k2 C+ e; Q4 p
39 V% E4 M1 A# _0 _' @- L
4
. I6 z( Z* N0 j2 c. o+ _) S 53 l9 u7 j7 Y' H' f3 p& O0 C
6
8 y. w a* v" ^! }: D 7
: S/ K) a) `0 m$ o& Y) h6 G 86 v& X; d- @; K: X+ q; g/ p
9
' O$ K. ^/ n# R. F4 h 10
8 B+ }0 \2 y# Y6 B 116 O4 q7 |8 [9 n+ a+ P1 _
12" e, |! T: e) J( }
13$ N' k$ }4 ~( `+ d
14
; Q5 i! n) S, S- [/ [ 15# h: Z, ]# |9 P9 U
16
" b9 C+ F7 j7 [0 e6 ^( a 178 s2 k2 v+ r& ~' o) ~$ H9 K" A$ N
18( U8 X; l/ O" Y: E# e* j1 i
19openwriter(string uri,string method)
4 L1 [4 n, e* f" q #region 打开一个流使用指定的方法将数据写入到uri
4 u5 J4 d3 X1 X1 N2 G ///( G/ e; H- [2 o2 H) o5 E
e, l0 U4 Y$ g f /// 打开一个流使用指定的方法将数据写入到uri
8 a7 K o% S, J7 Z& K: }( O ///
0 h+ P" ]- a( P) a; P& A. G7 Q1 u* f' Y7 ~; y9 Q) W
9 Z8 o' \& _- y; ]2 | ///
b' T. z' m1 o" t; c ///
+ Q: L" L( ?' s! O private void button1_click(object sender, eventargs e). h/ K2 T6 l( C, |" _
{1 \1 F% A t9 Z* c, I1 h( R
webclient wc = new webclient();
7 l# [% I: [. _) w) z- m0 k string uri = "http://192.168.0.35/cims30/rss.txt";
! d1 E6 q9 m9 o stream stream = wc.openwrite(uri, "put");( ~- h5 O3 {; [0 S$ u
streamwriter sw = new streamwriter(stream);
9 R+ O1 q: O8 V. k4 w sw.writeline("helloworldhelloworldhelloworldhelloworld");
; k; H1 y! E4 E; w( d$ A, P sw.flush();% T, E W# n4 V: v. y, r
sw.close();3 F* {5 }5 A( F$ f. W+ M
messagebox.show("ok");
7 \( |! \2 `, L4 ~/ P }' b' B7 @" ~- u8 A
#endregion
/ O2 t; z* M& S0 i. ^ openwriter方法返回一个可写的数据流,便于用户把数据发送给uri,可以指定用户把数据发送给主机的方法,默认是post,上例假定0.35的服务器上有一个可写的目录刺马s,这段代码是在该目录下创建rss.txt文件,其内容为“helloworldhelloworldhelloworldhelloworld”
3 S9 M2 P1 \4 f$ c- O& z/ W 上传文件# o. I$ c1 `0 A: M# t
webclient类提供了uploadfile()和uploaddata()方法,在需要投递html窗体或上传整个文件时候,就可以使用这两个方法。uploadfile()方法把文件上传到指定的位置,其中文件名字已经给出,uploaddata()方法把字节数组提供的二进制数据上传到指定的uri;) p$ J% y% x' J) j m
示例:上传文件
5 X$ |: K s; A" V: [: v/ v' c ?- f# O( T& Z- J7 @
#region 把本地文件上传到指定uri
" H3 u4 O5 h; _ ///
) _4 x& Z; C* D6 Q( W! ` s 6 J, D# v$ k: L
/// 把本地文件上传到指定uri
% J# {' E* O0 v; F ///; d, _- T5 Y! s8 N& Q. y
/ E0 S. ~( b, }9 D8 }
/ a u9 g- v* w* }# L4 O. z ///
4 U& N; t+ w* ^0 O6 L7 j ///
3 u' g; O6 U* a private void button2_click(object sender, eventargs e); r1 k+ ?# A0 G! ]- H1 Z- i. o! u, y
{
( ~6 t7 H2 ?+ O webclient wc = new webclient();
, f" ~# Z4 A( s, B' c: S) m string targetpath = "http://127.0.0.1/rss/data configuration.zip";
8 Y4 p5 D; j3 r! Z9 u9 u. D string sourcepath = "d:\\data configuration.zip";' J4 I+ G$ _; q$ U( Y$ C
this.label1.text = string.format("uploading {0} to {1}", targetpath, sourcepath);
3 O# `# l) H P* P7 @$ H byte[] bt = wc.uploadfile(targetpath, "put", sourcepath);
+ g3 o: e. D+ M+ e5 C messagebox.show("ok");# J7 O6 H7 Q: c0 `8 N
}" ^+ p2 @! B; A
#endregion
0 d$ x. s; a ^( [- K& C #region 把数据缓冲区上载到指定资源5 m/ t( a$ F6 U+ F0 M% m/ g
///% H. a4 X+ F( y2 m
0 ]. V; C: K4 i' v! V3 F+ J) m% c& G
/// 把数据缓冲区上载到指定资源
@ j& I$ ?! o S! g$ i/ f$ q ///5 o* j4 ]/ g# H4 i6 N8 T! R
8 w0 h- Q9 F) V8 s) J8 N# R# m
" B! ^ h K/ [: C8 d: w ///! F9 L9 v6 W, {* A
///
. A) F: M# @- \+ t% v private void button3_click(object sender, eventargs e), V' ]. m5 j6 O: _8 r0 c$ F
{
_8 a+ b: s. a! K* A webclient wc = new webclient();) j3 O- k% K. g Y, O
string targetpath = "http://127.0.0.1/rss/kaifeng.jpg";
, O' e4 z; D: `: S7 r% Z' F7 J e string sourcepath = @"c:\test.jpg";: X% X( b& x$ ~9 [& l* w& @
filestream fs = new filestream(sourcepath, filemode.open, fileaccess.read);5 M0 u- w' u5 J4 n( s
byte[] bt = new byte[fs.length];/ s9 T5 x9 v; u$ G) P! X
fs.read(bt, 0, bt.length);
, L, `- @' K* L$ |& k0 Y wc.uploaddata(targetpath, "put", bt);
8 {' |3 I) G. \, E8 [# @1 u' N }
& Y+ n! V& X% V$ \+ D# U- F #endregion
% ~9 E: c! \6 ]$ e6 H6 L webclient功能有限,特别是不能使用身份验证证书,这样,上传数据时候问题出现,现在许多站点都不会接受没有身份验证的上传文件。尽管可以给请求添加标题信息并检查相应中的标题信息,但这仅限于一般意义的检查,对于任何一个协议,webclient没有具体支持,。这是由于webclient是非常一般的类,可以使用任意协议发送请求和接受相应,它不能处理特定于任何协议的任何特性。
( u6 b0 Z4 ^' n更多技术文章信息请查看: 技术文章 |
|