返回列表 发新帖

c# webclient类用法实例

348.9k 9
swmozowtfl 发表于 2015-7-10 20:45:25|湖北 | 查看全部 阅读模式
  这篇文章主要介绍了c#  webclient类用法实例,本文讲解使用webclient下载文件、openwriter打开一个流使用指定的方法将数据写入到uri以及上传文件示例,需要的朋友可以参考下3 A2 F; v7 f+ v! ?8 b+ E" B. q
  进来的项目中要实现能够在windows  service中调用指定项目的链接页面。由于访问页面时候使用的是ie浏览器或其他浏览器,所以想起用webclient类。
" W) y" o; r9 H! ]  如果只想从特定的uri请求文件,则使用webclient,它是最简单的.net类,它只用一两条命令执行基本操作,.net  framework目前支持以http:、https和file:标识符开头的uri。
( c+ ~) ?$ _) O  webclient下载文件
& V% J7 _  P; N  使用webclient下载文件有两种方法,具体使用哪一种方法取决于文件内容的处理方式,如果只想把文件保存到磁盘上,使用downloadfile()方法,此方法有两个参数,即请求的uri和请求文件的的数据保存位置。
' p8 D* _: l7 C) g  更常见的是,应用程序需要处理从web站点检索的数据,为此要用到openread方法,此方法返回一个stream对象,然后,可以stream对象从数据流提取到内存中。
; _  }+ f3 d: p7 z: g  示例:openread(string uri);
4 E# j( {, \* @: M, ?  ?0 Y; d+ l& @: ^1 d
  1  T+ y5 k/ R/ t; s7 @6 f9 m
  2
& l( q! t& A) ?  3
: G7 b5 D$ ~- E7 L% b  4
+ h/ [" b+ e6 l/ e) }( C  5
7 \( g+ H9 a7 r+ R2 v, |9 I: s  66 V/ g5 b8 s1 k) \
  7! X8 c0 D& ?( B2 I1 R6 E2 s
  81 ^) A$ P* b: e: J4 X) \6 n  F
  9
: x9 _  }% P+ n7 e% z* a  10
  Y3 L/ r! y& s  U# p2 o/ c0 ~  11
) ?5 C$ j5 c8 o* f: w. b  12. F( G1 B" W# T: S9 a
  13
: u: ]+ V8 n. i' p9 \, u# m6 i  14
& I* C1 _( v& k* E! K: z$ I  15
8 ~  B( I! ?! f3 R; G; t  16
; ~/ O( S8 e; ]' F. \# ]  17+ w  a/ y% Z7 }# P
  18
  s  L" w( \) Q/ f2 B. m- x  F  19
2 p$ B4 ]: J9 D6 p4 h  20
7 B; g. A, d% o2 |7 L4 A+ h  a+ n1 N  21openread(string uri)) Z$ L  ~  m6 f# @* D$ d
  #region 读取指定uri的html
. A: z) R' s1 A8 |8 ?0 d4 V2 m  ///) V. L" z9 s3 X

/ @- r- }% Z$ B5 r1 `% n  /// 读取指定uri的html
  H4 n; A/ q* T/ X8 a& N  ///
5 B0 _( Q  q1 z9 i7 q9 v; b  l3 d2 n
1 X; Y; q6 y, q. M4 j# v
  ///. v% v0 T: s: P+ A8 G& \
  ///
; g+ J( k- K. f  private void button4_click(object sender, eventargs e)
5 w% Y. ~6 d* J$ t3 K0 `6 T7 u  {4 }8 @; a2 k" _( e' J% I
  webclient wc = new webclient();8 G+ {2 z7 Q7 Q$ g2 H
  string uri = "http://127.0.0.1/rss/sina.aspx";
0 j9 {5 x: V# w5 A2 j7 Q+ M  stream stream = wc.openread(uri);0 O+ F6 d4 b* ^( ^* P
  streamreader sr = new streamreader(stream);
7 A* e# k0 w1 K8 O* {% o( j  string strline = "";6 F% u( W- d' B3 s
  while ((strline = sr.readline()) != null)
; V: _4 n' G% `, e  i  {& r0 n' x  J# ^' @" B  S# J- D
  this.listbox1.items.add(strline);3 X5 I" _2 t1 C! `) V/ R8 D/ Q# I
  }
) p: J2 Q* C3 ?! D5 k  sr.close();
, J" T! v5 q6 e) p2 c; A  }
, M: v& U, M+ `6 Q; M* L  #endregion' i. O% G4 O6 R: b6 E* v
  示例:openwriter(string uri,string method);- z( t% N4 X. _% A, }  ~
  ?
3 v! C& O! U0 E2 r  1
+ W" `. t6 R) |& q( }# V  2% I+ K4 w7 w3 P4 ?/ {
  3" V! V4 R# R( _' D, `' M+ [3 l
  4
6 k) o6 n, H4 J- `# W# L* i  5
7 Y8 e* s- W; k4 ?8 e8 j  69 P/ z5 U$ u) G" t0 X: p
  75 z# X. `% O0 D) N2 o8 B& U8 \
  8
1 p& L9 D2 W- @2 C  98 e/ ~) `! T) f7 f7 m
  10! B  m0 J1 ?9 q4 b. O* G+ B
  11
' R. y* J$ B: z+ z" S! y8 s  12+ K) l- n3 v. G. F; f7 S
  13! r( m/ ?, `+ Q( }2 {$ r
  143 }5 k, B% ?4 \4 t& ?( X
  151 M! g, {* f4 ?; e- C6 v1 J
  16
( X2 y! Q& F# @/ x, u3 a/ k6 m/ w  17
6 s7 _0 q# q5 x6 q, {2 [3 s. r! G  181 h0 ^/ ~* N: @8 {( M7 o( x
  19openwriter(string uri,string method); s* v# P9 ]1 \! F/ ^% U
  #region 打开一个流使用指定的方法将数据写入到uri
+ C% C) \2 S; Q7 U  ///
7 L. j  x/ D% U1 Q 5 N; R) e: ]! f: L3 C
  /// 打开一个流使用指定的方法将数据写入到uri' _, J3 c. q5 [4 v9 f) }, F
  ///
0 Q) Q" H8 X% \0 ]& q0 d
: D1 M# i+ r) X3 Q6 Y4 S1 K6 X+ M - z  w, W+ N, F
  ///
, V/ q! w0 `3 B* E# ^  ///
8 z5 V9 |1 w3 o$ R( I' z9 N  private void button1_click(object sender, eventargs e)+ |7 ~6 k8 e5 i
  {
0 ^4 O+ H! u4 y5 z7 P* Q  webclient wc = new webclient();
8 K  r! Y, v9 j% y& ?- @; y/ S  string uri = "http://192.168.0.35/cims30/rss.txt";) L( i9 G6 V0 K2 v& J
  stream stream = wc.openwrite(uri, "put");1 ]; y+ ~( k6 l! R! r
  streamwriter sw = new streamwriter(stream);
( }# ?8 ?/ ]  T' S, }  sw.writeline("helloworldhelloworldhelloworldhelloworld");. A( J% t8 v6 M; P: B& z& ]
  sw.flush();5 Q& @  L- I4 z7 Z$ Q$ H. r* Q5 b
  sw.close();
- E+ L  L9 s" z$ o4 U" R2 s  messagebox.show("ok");! k, I$ H' D# L1 c& e6 v% Q
  }& x& E& I2 o7 W# m6 f
  #endregion
* s/ o8 c/ [; t5 O, ~, F& T! `  openwriter方法返回一个可写的数据流,便于用户把数据发送给uri,可以指定用户把数据发送给主机的方法,默认是post,上例假定0.35的服务器上有一个可写的目录刺马s,这段代码是在该目录下创建rss.txt文件,其内容为“helloworldhelloworldhelloworldhelloworld”
( B& O0 `; {/ I+ t  上传文件
" E2 g7 K1 Z9 m& D& D  webclient类提供了uploadfile()和uploaddata()方法,在需要投递html窗体或上传整个文件时候,就可以使用这两个方法。uploadfile()方法把文件上传到指定的位置,其中文件名字已经给出,uploaddata()方法把字节数组提供的二进制数据上传到指定的uri;! ^) z0 r0 X7 K9 C; p# o
  示例:上传文件8 x0 E6 `# k: O: h. ]' S: O
  ?1 u0 o1 X+ C7 n- g0 j+ q
 #region 把本地文件上传到指定uri1 u$ k4 w' c& w# F
  ///8 K6 U! q! y% Z' Q- o3 _

, {3 i/ h5 `, r* P  N  /// 把本地文件上传到指定uri
% l& f2 i0 {5 I4 t- v3 H  ///+ B) b0 n% }. }# h& c9 t! X6 h

7 w: u( L  {& y+ |! D* \+ c" E+ \# s
7 t4 I% S+ q3 L0 R/ Z: B  ///, f, b. r+ J* B( S
  ///
8 v* ]1 a" J8 U& S. {9 V  b. B  private void button2_click(object sender, eventargs e)1 V  B! ^. {* D) Y( N* \
  {2 x) H# b/ {" n; t; ^
  webclient wc = new webclient();8 i$ b% B& N$ ~3 v
  string targetpath = "http://127.0.0.1/rss/data configuration.zip";
% v1 T- k# z& z  string sourcepath = "d:\\data configuration.zip";; B/ b, @6 N8 m$ g! Q
  this.label1.text = string.format("uploading {0} to {1}", targetpath,  sourcepath);
+ H( q6 M' |7 j6 ?9 K0 K  byte[] bt = wc.uploadfile(targetpath, "put", sourcepath);9 O# ]# C4 r4 T
  messagebox.show("ok");
! ~6 ~9 C# q9 l$ E  }
$ q2 N+ D$ h9 s! U* F  #endregion5 P6 e# q; u; T/ q; h. K+ A2 o
  #region 把数据缓冲区上载到指定资源
/ g" t; X0 u' `6 s7 y: w: c  ///
* N, F# P* N& s; I9 c) k' t% Y
5 d* _+ m. H* [# ?# ?! C3 y2 x  /// 把数据缓冲区上载到指定资源. A, D- R# R$ Y0 n
  ///( X% W4 \& e% [0 C$ n, _
. Q% f. w# E1 K

* Q6 N7 V" B; X2 b  ///; I! J/ Q" Z* J0 q& m- Q$ ]
  ///8 r) @# O& \( X5 g5 t7 _& W
  private void button3_click(object sender, eventargs e)
' k+ v, t* J, O3 Z  {) |7 z4 M" r. y8 R9 r" {! L
  webclient wc = new webclient();  O0 j- _: L5 Z' d
  string targetpath = "http://127.0.0.1/rss/kaifeng.jpg";
0 Y( m- W, W4 G! n2 c  string sourcepath = @"c:\test.jpg";" K2 m3 M: R5 u/ B
  filestream fs = new filestream(sourcepath, filemode.open,  fileaccess.read);
5 ~: J/ N2 ?  I5 ~  Z  byte[] bt = new byte[fs.length];
6 B: K* l  X5 Z' X7 R  R9 [6 N  fs.read(bt, 0, bt.length);
) z1 O0 m5 ?* U% }  wc.uploaddata(targetpath, "put", bt);, @! Z. g/ M! ^" v
  }
4 J( y$ a8 _% `2 u: M, M  #endregion
2 }# w$ L) h# j3 @' S  webclient功能有限,特别是不能使用身份验证证书,这样,上传数据时候问题出现,现在许多站点都不会接受没有身份验证的上传文件。尽管可以给请求添加标题信息并检查相应中的标题信息,但这仅限于一般意义的检查,对于任何一个协议,webclient没有具体支持,。这是由于webclient是非常一般的类,可以使用任意协议发送请求和接受相应,它不能处理特定于任何协议的任何特性。
9 \1 r; F9 f$ Z更多技术文章信息请查看: 技术文章

回复|共 9 个

Acropozelan 发表于 2016-3-21 16:44:47|美国 | 查看全部
我在顶贴~!~
tohme 发表于 2016-3-21 16:45:12|中国 | 查看全部
哎 我我我怎么办啊??
gevaemaidovef 发表于 2016-3-21 16:45:14|Reserved | 查看全部
我不是来为楼主呐喊加油的,也不是对楼主进行围堵攻击的。
GoodyFouppy 发表于 2016-3-21 16:45:47|INNA | 查看全部
其实今天baidu 又 抽风了
buingeEvineus 发表于 2016-4-3 15:19:45|美国 | 查看全部
楼主,你要继续努力啊!你是bbs的希望啊!你是网络文学的希望啊!你是整个网络界的希望文学界的希望啊!你是整个人类的希望啊!你是整个太阳系的希望啊!你是整个异次元空间的希望啊!
mwxny 发表于 2016-4-3 15:20:03|辽宁 | 查看全部
怎么就没人拜我为偶像那??
Mqokjdvq 发表于 2016-4-3 15:20:23|日本 | 查看全部
哎 我我我怎么办啊??
alapScady 发表于 2016-4-3 15:20:41|河南 | 查看全部
这就是我斗胆的一点粗略分析,每天睡觉以前,我都会把您的帖子再三拜读,拜读。
wwzcdenleclv 发表于 2016-4-3 15:20:45|INNA | 查看全部
去干吗啊~~~伤心啊~~~

回复

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

得知互动是一个融创意、设计、开发、营销、生活、互联网于一体的专业交流分享平台。
Copyright © 2026 得知互动-专注Ai与站长技术交流社区-Ai交流平台 版权所有 All Rights Reserved. Powered by Discuz! X5.0 鄂ICP备15006301号-5|鄂公网安备 42018502006730号
关灯 在本版发帖 扫一扫添加QQ客服 返回顶部
快速回复 返回顶部 返回列表