返回列表 发新帖

c# webclient类用法实例

348.7k 9
swmozowtfl 发表于 2015-7-10 20:45:25|湖北 | 查看全部 阅读模式
  这篇文章主要介绍了c#  webclient类用法实例,本文讲解使用webclient下载文件、openwriter打开一个流使用指定的方法将数据写入到uri以及上传文件示例,需要的朋友可以参考下
& m; M4 T3 r' F. J) X' ?9 E7 X  进来的项目中要实现能够在windows  service中调用指定项目的链接页面。由于访问页面时候使用的是ie浏览器或其他浏览器,所以想起用webclient类。
. o0 t" t+ e, K! ]/ `# C9 v/ y  如果只想从特定的uri请求文件,则使用webclient,它是最简单的.net类,它只用一两条命令执行基本操作,.net  framework目前支持以http:、https和file:标识符开头的uri。
( Y$ \8 q  p* Z! R* ~( t: K0 b  webclient下载文件$ R7 p  t) ~9 R: Z5 |. r
  使用webclient下载文件有两种方法,具体使用哪一种方法取决于文件内容的处理方式,如果只想把文件保存到磁盘上,使用downloadfile()方法,此方法有两个参数,即请求的uri和请求文件的的数据保存位置。
3 ~6 a4 X, q' d  更常见的是,应用程序需要处理从web站点检索的数据,为此要用到openread方法,此方法返回一个stream对象,然后,可以stream对象从数据流提取到内存中。
& F: ]9 _6 g2 y- M3 T  Y6 m  示例:openread(string uri);
5 e1 d% o' j) P# X, ]7 {  ?
! H3 z) M# U8 E. n& p/ \  1! D4 `  s" O1 [, }
  29 O8 h' Y( t) H/ [/ N
  3, p% Z& D, v+ X) `7 |& a
  4$ m, x8 g/ e, W* ~4 x
  5- l" J( P7 u( I2 T* i8 u# t
  6
* S, M, H, ?% B; i& u  7
3 c6 u1 E# r4 w3 K' ^  8" O* o# t; l! L9 r9 z8 m9 R
  9
: u1 U& _5 {' V' @' X  10" I2 g6 y. [# ?5 _) E
  118 q% g- |& b: V" I3 B" S
  12
& f& y9 z9 i& C" {% {. b  13
& c' M) @7 F( p3 {2 h  14
$ \/ |7 O1 z! X5 E2 b( G$ X  15
1 _0 k2 {# F( s, ~0 ^3 C+ K) }  16
6 ~. g9 e+ r3 x4 U$ N% n8 m* x& Y  17: i- I! D' C/ b( {8 Q5 K
  18
! L: u% s5 M. S, d  k, x$ C: ^. Q  19
  [' q) G: E2 K% j! A  20
$ m; N. m! ^" c! \, E6 @  21openread(string uri)
. U' r# J4 f( }5 `, [9 j! I  #region 读取指定uri的html
, r' w/ w/ w0 |2 J2 o  ///, q& i& S, r' g5 Z

) w6 F* w8 N" E  /// 读取指定uri的html6 b) B+ D! a6 Q! n4 M3 {
  //// [8 N) j* V" _. ?

1 J7 N# A) m  `  R$ i: O4 v$ v 5 i  f9 G2 t6 Q- Z
  ///
) T! l# T: U1 j) x  ///
( {8 T1 h' X* x' a: a9 [5 i& o  private void button4_click(object sender, eventargs e)
( a0 c/ Q% h  H4 J2 d: i  I" Q  {
( B$ S% g8 k1 ~/ {& C$ |: z  webclient wc = new webclient();
) w7 m# W  k+ g8 \1 d% E' _7 w  string uri = "http://127.0.0.1/rss/sina.aspx";
, j* E- K7 c& U3 N  stream stream = wc.openread(uri);& |. i9 j) i- u/ A- D. {
  streamreader sr = new streamreader(stream);
0 l# m0 ^9 k! J$ F; W, h  string strline = "";4 h3 |) |7 w* u
  while ((strline = sr.readline()) != null)8 e& R4 _0 \! S# \
  {
& A- m0 v2 E$ I- A1 d$ {5 D  this.listbox1.items.add(strline);4 g1 b8 W7 w* x9 \. \/ Z. u5 I/ d: c5 Q9 T
  }/ n# A' w9 C: l9 A, r9 L7 b
  sr.close();
: @  H0 [& f8 L  X  }4 Q2 {# X# L3 Q# V: g' m9 O6 O, ?
  #endregion4 h" k" l. S5 I5 G0 _8 ^& z
  示例:openwriter(string uri,string method);
- X; J' d; [; f0 b7 z) R; c+ m  ?
3 V5 W) b; ~1 C. z/ J- c  1% H7 \/ O/ @4 o$ }( A* z, m
  2+ a! e" \; Y+ w" i
  3* ]0 d3 y# g( {: U" E0 n
  4
8 \' ]4 Z+ ]; h  5
6 N! U' f8 `% k  63 S: k# \3 E% F) a% S  X/ n
  7
6 z5 q& B3 e3 _$ w" X  8
+ H7 l; P& K, n7 V9 j2 O  9
4 c! E$ H- s  g( f  10
+ \$ e# ^( o' E! K  11
8 ?7 h3 {" V) a, h, _  12
; \& v! |, Z9 m  13
/ @0 K8 k- A3 q  t  14
6 D8 W/ y; x7 P% K3 Y: t; g  15
  a0 \- I) q$ K! M7 ]- k  16
$ L: Q2 e4 v3 V) ?  i" r$ F  17
/ O6 _4 u5 F9 J& |$ F  18
# H+ ~. H, ?& |6 l/ x5 y  19openwriter(string uri,string method)
$ N# w5 t. x9 k3 M! @* v  #region 打开一个流使用指定的方法将数据写入到uri
0 ]5 ~/ W  d8 J; I1 I/ X  ///' X8 q" n' S7 t9 I( G0 O
+ \+ X6 l  O# h% L. L
  /// 打开一个流使用指定的方法将数据写入到uri8 M$ {7 _/ @9 m( x' D
  ///8 i* I0 g& b& F8 X; k! ^8 d
& T  ]2 z7 R, C) R6 N

, d. B+ K6 d; Z  J; ~: M/ Q8 b  ///
" L" \- k0 c( H9 h6 r# G! m) P: x! H  ///. Z2 R+ E) M: g0 r
  private void button1_click(object sender, eventargs e)
- q( }7 r" `9 L/ N; q, R! b. x  {, e9 L& c% @* ^. t+ h
  webclient wc = new webclient();
. x, s- m4 S9 G! U  string uri = "http://192.168.0.35/cims30/rss.txt";8 y- b/ F" a8 k/ x, K
  stream stream = wc.openwrite(uri, "put");
5 Y( j* Q. K  D/ Y" N% R: g8 P  streamwriter sw = new streamwriter(stream);& C5 c/ N9 a4 X0 k! y: W7 {* b- _
  sw.writeline("helloworldhelloworldhelloworldhelloworld");
7 x: U+ P9 [' c6 M- F  sw.flush();
! m5 E& H1 \2 B2 Z/ P# T  sw.close();/ B9 Q4 m* ]  r. ~! d
  messagebox.show("ok");
& R" k6 Y8 t6 s  r9 ~  }
) ]8 Y* @7 n8 |  #endregion4 `2 ^) i: D) f$ ]
  openwriter方法返回一个可写的数据流,便于用户把数据发送给uri,可以指定用户把数据发送给主机的方法,默认是post,上例假定0.35的服务器上有一个可写的目录刺马s,这段代码是在该目录下创建rss.txt文件,其内容为“helloworldhelloworldhelloworldhelloworld”! f/ v& K$ \# I% z  _& J
  上传文件/ m/ {/ c2 O1 Z5 v$ K
  webclient类提供了uploadfile()和uploaddata()方法,在需要投递html窗体或上传整个文件时候,就可以使用这两个方法。uploadfile()方法把文件上传到指定的位置,其中文件名字已经给出,uploaddata()方法把字节数组提供的二进制数据上传到指定的uri;
- a( C3 e' E2 Z7 n% D& l1 F9 K  示例:上传文件( L. ?* W$ g2 u9 E+ ]  w
  ?4 P! B1 Q8 ]& G+ q. m% [
 #region 把本地文件上传到指定uri2 W5 @+ c- E7 T" K5 ], t! z
  ///2 r  Y$ b% F/ d7 @

/ @" q! A) V2 h0 [/ M1 m  /// 把本地文件上传到指定uri7 y0 X8 `# q$ m# q! r) Q+ _1 ~
  ///8 _) Q, i7 d# b, `! n
& _1 Z9 P4 S' `$ W5 q! c1 M2 K

/ e4 ?% U8 x# Q  ///; k% W; g* a, S) f0 J7 s
  ///6 j& _$ g, g. h$ B4 |
  private void button2_click(object sender, eventargs e)/ c- K4 b$ r9 t  i8 p& {% I
  {6 P( `* T$ P: \& l/ D8 f3 @: M1 g' T
  webclient wc = new webclient();
& y( q" d! ?, C$ S" Q4 g; D0 n  string targetpath = "http://127.0.0.1/rss/data configuration.zip";& ^% J% P( \' N" l: ^; R
  string sourcepath = "d:\\data configuration.zip";  z/ n3 t) ~3 W8 o- ^1 A" M; S
  this.label1.text = string.format("uploading {0} to {1}", targetpath,  sourcepath);3 F* w. k9 ~/ \, a# C% N
  byte[] bt = wc.uploadfile(targetpath, "put", sourcepath);) p1 D( M' h+ y# _# W2 p
  messagebox.show("ok");
. a6 s# o9 r" g4 ]- X- m0 `  }
# l# C/ y& I1 n  _2 z& q4 L2 w, ?  #endregion1 r& f: I# s* L
  #region 把数据缓冲区上载到指定资源
8 M- U0 w# j3 R& n8 {- B2 s- G  ///
- c* ^/ q0 w' i) A% }" n9 X; W" Z5 B9 V
/ X% L3 x+ r3 r  /// 把数据缓冲区上载到指定资源" B) |0 j* y5 T0 L2 Q
  ///
- O4 X5 `- c0 d7 f/ v8 d- k/ k/ E+ F2 Q( F% Y2 r& x0 v1 @+ G1 ^6 ?
# t& O+ p* y% [
  ///: @( `& s7 I* `- O
  ///3 V; J5 {4 k. d9 ?7 [# A
  private void button3_click(object sender, eventargs e)
+ ?7 Z$ H7 t5 Y4 ~# G  {  K9 j  Z5 v  R9 |3 W
  webclient wc = new webclient();1 e- ~% ^/ D) F! s! h
  string targetpath = "http://127.0.0.1/rss/kaifeng.jpg";
# E8 _- V) c0 ^  W/ H% M  string sourcepath = @"c:\test.jpg";$ F7 R  h8 d, p# T$ f! {2 f+ c" t
  filestream fs = new filestream(sourcepath, filemode.open,  fileaccess.read);  ~" J) t  L; J' x# u+ ~
  byte[] bt = new byte[fs.length];' {2 E/ {  B. a7 }
  fs.read(bt, 0, bt.length);) v9 w, U( X2 _' y* w
  wc.uploaddata(targetpath, "put", bt);
, D3 y0 D# d3 }- y6 w  }
- Q* b+ E, F8 q; O, `' i  #endregion
, F% B/ b$ R/ N: N6 |  webclient功能有限,特别是不能使用身份验证证书,这样,上传数据时候问题出现,现在许多站点都不会接受没有身份验证的上传文件。尽管可以给请求添加标题信息并检查相应中的标题信息,但这仅限于一般意义的检查,对于任何一个协议,webclient没有具体支持,。这是由于webclient是非常一般的类,可以使用任意协议发送请求和接受相应,它不能处理特定于任何协议的任何特性。
! C9 J2 c. q; Y& R# @3 d) U( I' k更多技术文章信息请查看: 技术文章

回复|共 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客服 返回顶部
快速回复 返回顶部 返回列表