返回列表 发新帖

c# webclient类用法实例

348.7k 9
swmozowtfl 发表于 2015-7-10 20:45:25|湖北 | 查看全部 阅读模式
  这篇文章主要介绍了c#  webclient类用法实例,本文讲解使用webclient下载文件、openwriter打开一个流使用指定的方法将数据写入到uri以及上传文件示例,需要的朋友可以参考下; Q  j' e6 C. ~* D8 K
  进来的项目中要实现能够在windows  service中调用指定项目的链接页面。由于访问页面时候使用的是ie浏览器或其他浏览器,所以想起用webclient类。
7 e' f; i! n. {" b  V! U7 r  如果只想从特定的uri请求文件,则使用webclient,它是最简单的.net类,它只用一两条命令执行基本操作,.net  framework目前支持以http:、https和file:标识符开头的uri。
4 _8 y9 q0 w5 Q" g7 f  webclient下载文件* }9 s1 w/ X* L& _  _) y
  使用webclient下载文件有两种方法,具体使用哪一种方法取决于文件内容的处理方式,如果只想把文件保存到磁盘上,使用downloadfile()方法,此方法有两个参数,即请求的uri和请求文件的的数据保存位置。  q& j  e) F7 s% }) h7 u8 T
  更常见的是,应用程序需要处理从web站点检索的数据,为此要用到openread方法,此方法返回一个stream对象,然后,可以stream对象从数据流提取到内存中。- f- k4 u" D3 E5 m2 X9 ~% l
  示例:openread(string uri);/ R+ H! p/ q( q$ Z
  ?6 b" o  A4 l  `* N( M
  1% M8 ^# ]/ u& L" Q+ U* m
  2
& b' n# l# h6 a  Z1 T  3
! H) ]; C+ r+ ]. R  4
" O0 o  s3 }5 u" Z1 \& F7 J  5
- I7 L9 h* X+ O. H  6
$ T7 _- |: u4 X. R; a: s9 J  7! d3 S7 ^$ U$ ]
  8
' }. g" ^; r1 X6 ~- I0 n  9, u) ]; O6 K0 r! Z2 K' y
  10# F9 u7 r( n% A8 f* t8 w( q0 p( B
  118 q7 W& i, p7 {& j4 H3 E7 i5 V, @7 p
  12
. ~& l" I8 m3 J! R  13
/ m* v/ J$ a0 P3 v, d+ y3 \. R  14. E: D( \- W% G4 _
  15
8 J* _, v0 A; h8 `8 Z+ K  16( Z) w$ D! p1 }' r# B  e
  17
  F9 a0 t+ U# y  18  D0 Z1 j5 \2 a; o
  19
( P5 l5 s1 }) E. r2 q( T$ y* p- H  20
* g9 _$ }  F( C  u; u  21openread(string uri)
1 j* J' e" V- N8 U" e7 n  #region 读取指定uri的html' z( p5 V/ S3 ^/ @4 H
  ///
" K0 _0 |2 w9 y' ~5 u7 S ) Y9 ]- a% i) n9 r7 y! I
  /// 读取指定uri的html
' _2 u3 z8 |1 B' `  ///
2 _0 ~7 v/ n1 C
' o; q2 P, X6 r4 Z6 E" ]
8 J- A% y* D+ Z  ///9 v0 z+ a, B: x/ Z
  ///
/ B  }. G9 _+ g+ i+ l7 @  private void button4_click(object sender, eventargs e)
" T& [! H2 R% D( R  {
8 @4 u: j' n7 w2 q" H  webclient wc = new webclient();
7 @0 R8 U2 W; @; G! o( m4 r  string uri = "http://127.0.0.1/rss/sina.aspx";
  I9 \1 i! C% B" q! d/ Y  A  stream stream = wc.openread(uri);5 q: ]$ v8 e3 p' F$ H
  streamreader sr = new streamreader(stream);
; C: M3 t. `  Z3 L& `8 |* F* U  string strline = "";7 O% j) ]/ u0 o4 N
  while ((strline = sr.readline()) != null)8 p, s4 ~* ~8 e! d' i2 p
  {& l* C0 I# E$ d/ U! N3 j& U
  this.listbox1.items.add(strline);2 m1 ?7 l0 `/ ?( P  o1 x# b# g
  }2 u* V4 [9 `. t& D9 i1 e7 J6 |4 a
  sr.close();
0 ~) [. `" m. ~, M0 p; K  }
& t& y3 B  p5 m4 l) t  #endregion0 n& Z) P, V, z$ D% w
  示例:openwriter(string uri,string method);
) Q% N* ]( m0 @2 l1 y. p3 ?  ?4 t/ t3 @8 P9 x) T) Z
  10 f* Y+ L  s! {& W( i
  2- a7 w8 @% P' E" w
  3$ y. q  |7 I" n- F7 F
  45 T4 |% ~( ~9 z# v; \$ W/ J
  55 T) }. U& A4 e! h7 U' @& d2 F
  6
) j& k, m- I$ a* |: U7 {8 c  7
) _7 {" U: f' _$ x* S0 c  8
; p5 l& \4 }) d% C$ d+ D- W1 v  9
( }9 J1 Z, |% U: ~8 n  105 Z6 p* V& _0 T% X9 F1 O3 p% t
  11
8 A" V, h) c2 O! T& Z  122 w5 d# N9 h4 t; }3 T) n# {
  13/ V+ x. y7 G" ^5 }3 w
  14
5 r- Y# ?  m8 y  15- f+ I: R: ^. U' l
  16; g2 Y3 o; g4 y' d5 |5 A7 y, O
  176 u4 P/ a8 v' I
  18
9 S8 E/ m2 @& [1 P$ i2 e9 Z: f  19openwriter(string uri,string method)+ Y8 K7 h0 @0 v8 @
  #region 打开一个流使用指定的方法将数据写入到uri
$ A3 N! }' b- q/ g  t& P$ Z  S( s  ///( j; Y; ?: V" {9 X
, u# V; {3 l- o" E6 Q5 r/ c6 d
  /// 打开一个流使用指定的方法将数据写入到uri
' c. P; \! F1 S; ]1 a  ///
& j* M5 U2 A3 a( [: V) v* Q# G( ^, ?0 X( e' m
4 W! A6 i! L; H$ }* n$ ~+ j, N
  ///  ~/ C9 d! P6 m+ f
  ///: }# o" y- F# c$ F
  private void button1_click(object sender, eventargs e)- E6 Z* Q+ X8 _2 d
  {( b/ l+ u" F* Z0 _$ M) K) w
  webclient wc = new webclient();
0 a. @4 |3 Z. ^$ G: t0 N  string uri = "http://192.168.0.35/cims30/rss.txt";
2 b; g; P1 L7 ~+ g4 u6 p5 x* t  stream stream = wc.openwrite(uri, "put");
( s. j2 F$ n  d5 f8 c. @  streamwriter sw = new streamwriter(stream);% l: H4 z- h9 _- B  v- g* l' c
  sw.writeline("helloworldhelloworldhelloworldhelloworld");' |9 V& Y# b: A' x; a$ L
  sw.flush();
+ t4 |  Y3 I1 f  sw.close();: ]# r7 Y* x* B. l. A" J
  messagebox.show("ok");1 U4 ~- L' R5 w: u" q3 @
  }) Q4 B; S# Z7 i! G
  #endregion  O" F8 m* @" w" I
  openwriter方法返回一个可写的数据流,便于用户把数据发送给uri,可以指定用户把数据发送给主机的方法,默认是post,上例假定0.35的服务器上有一个可写的目录刺马s,这段代码是在该目录下创建rss.txt文件,其内容为“helloworldhelloworldhelloworldhelloworld”
5 j* t) @, n% a: q. H. B& Q% e# w* R  上传文件8 D/ L' ~+ I; ]/ c0 K% Q6 p2 B
  webclient类提供了uploadfile()和uploaddata()方法,在需要投递html窗体或上传整个文件时候,就可以使用这两个方法。uploadfile()方法把文件上传到指定的位置,其中文件名字已经给出,uploaddata()方法把字节数组提供的二进制数据上传到指定的uri;' M+ J! `# j- \: p' r; Z. W5 a& n
  示例:上传文件
  j, h, Q1 }1 k  ?
4 L% V+ J4 P. f, u* e #region 把本地文件上传到指定uri
$ V/ o8 T5 Y: ~& l, C+ }/ j2 n  ///. [! c1 p" m% b- C1 W; H5 E

3 r1 j6 W2 R' Q2 f  O  A  /// 把本地文件上传到指定uri
% Y4 y* Z. _1 z. _- x4 H  ///
" W; o* x2 t, Y$ V4 C: h! {3 S4 q! Q6 u. m' |* q

4 n! C! b  }" G0 e  ///0 X( R1 v- I7 q4 S
  ///
+ L3 t" a/ L6 Z' z! \0 N  private void button2_click(object sender, eventargs e)4 w0 k( U# V3 S7 G( B- g
  {7 g0 J. N* e7 k" a! ^
  webclient wc = new webclient();0 Q, }- C2 B0 I$ O' P! ~: V
  string targetpath = "http://127.0.0.1/rss/data configuration.zip";
0 j! S; i$ W! G; P  string sourcepath = "d:\\data configuration.zip";
3 ^7 k- j& h2 F. w" q1 M6 E  this.label1.text = string.format("uploading {0} to {1}", targetpath,  sourcepath);
$ |1 k7 v/ R/ L3 T8 c' ]+ [: _0 X  byte[] bt = wc.uploadfile(targetpath, "put", sourcepath);. Y' S% Q# M* T5 i0 J
  messagebox.show("ok");% Z7 `6 ?, a. d9 \0 Z8 B
  }5 ~0 w# H+ ~( L2 A
  #endregion4 w3 E4 V9 u/ P1 x' n
  #region 把数据缓冲区上载到指定资源- a( e) B" O9 k1 }. N2 R. v
  ///) R/ _' @, M$ B/ h& z2 x" U9 k
# l2 _$ U2 Z2 D, I% l! E
  /// 把数据缓冲区上载到指定资源
" q3 Y5 O8 g+ f1 d* s+ i  ///6 N. A6 r5 B$ W, o. l6 v1 f

# u( z7 u8 @# g
) B, ]8 ~, s6 t3 i/ P  ///4 f4 u6 ~: W1 l2 p$ Y7 K8 P) N1 J5 O  l
  ///( ~5 I5 \9 Y' T3 R/ c
  private void button3_click(object sender, eventargs e)
3 Z5 T: y0 p; w" c  {
" H. L4 n0 B" Y! S: N% Y) r2 z  webclient wc = new webclient();
, P/ S8 g; |3 S& G3 A, a9 K  string targetpath = "http://127.0.0.1/rss/kaifeng.jpg";; c4 d8 L; W' {- u
  string sourcepath = @"c:\test.jpg";- T" {$ f5 c6 S# D/ f4 N
  filestream fs = new filestream(sourcepath, filemode.open,  fileaccess.read);0 j: v4 u0 Y0 _! y) X4 z
  byte[] bt = new byte[fs.length];1 T) K  c. I! r- I) H2 R( e
  fs.read(bt, 0, bt.length);
) J2 T7 T* u" I6 k  wc.uploaddata(targetpath, "put", bt);3 a! c) R. P5 C8 ~  h; ]* P! Y
  }% G8 [" D7 y9 W6 P; q  D; ?
  #endregion
6 _/ l9 K, t$ {/ H/ Y+ Z  p0 }  webclient功能有限,特别是不能使用身份验证证书,这样,上传数据时候问题出现,现在许多站点都不会接受没有身份验证的上传文件。尽管可以给请求添加标题信息并检查相应中的标题信息,但这仅限于一般意义的检查,对于任何一个协议,webclient没有具体支持,。这是由于webclient是非常一般的类,可以使用任意协议发送请求和接受相应,它不能处理特定于任何协议的任何特性。
9 d. v" J. g' h, e" h' W. h( O9 Y更多技术文章信息请查看: 技术文章

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