返回列表 发新帖

c# webclient类用法实例

348.7k 9
swmozowtfl 发表于 2015-7-10 20:45:25|湖北 | 查看全部 阅读模式
  这篇文章主要介绍了c#  webclient类用法实例,本文讲解使用webclient下载文件、openwriter打开一个流使用指定的方法将数据写入到uri以及上传文件示例,需要的朋友可以参考下9 b7 V2 q+ b( V
  进来的项目中要实现能够在windows  service中调用指定项目的链接页面。由于访问页面时候使用的是ie浏览器或其他浏览器,所以想起用webclient类。$ D8 n5 M% ^5 I( L9 g' W% m
  如果只想从特定的uri请求文件,则使用webclient,它是最简单的.net类,它只用一两条命令执行基本操作,.net  framework目前支持以http:、https和file:标识符开头的uri。
# \$ C. Q: M! U; ]6 R2 p- Y  webclient下载文件
$ s$ [6 A$ H5 W, P+ x+ t5 o- u  使用webclient下载文件有两种方法,具体使用哪一种方法取决于文件内容的处理方式,如果只想把文件保存到磁盘上,使用downloadfile()方法,此方法有两个参数,即请求的uri和请求文件的的数据保存位置。
- w- M" ]1 A2 X  更常见的是,应用程序需要处理从web站点检索的数据,为此要用到openread方法,此方法返回一个stream对象,然后,可以stream对象从数据流提取到内存中。
) b0 A3 y0 Z  B; |  示例:openread(string uri);
3 ~" C* j2 e# i) x! o% ^  ?
: x+ Z$ A" e: t; J4 n$ t1 p  15 R' b3 a4 O; q6 M/ X6 V* |
  23 o3 K2 R0 t! V$ ~6 R
  36 A! {( T3 p" p
  4# f5 K2 Q. `" b% n- [2 v" u
  5
* B% m9 z5 q5 h: h  B  6' b/ e# l6 ]7 {2 @5 \& {
  7# l* G6 o' h2 Q3 L+ i3 c
  8
7 S" z& f2 n3 s- @3 {; y  9
" q1 X2 q/ H7 g% ?& }' Y7 R9 }! K  10
3 M" F% o% [0 X  11
! T* H6 t' V! P! a7 p  12
0 {6 z" F# d2 K) N& ~( g7 _  13
: w0 r) ]. I. ?/ g  14* d8 U( i( {6 \+ L$ K) v
  15
0 c6 i0 H. H# w" U- S  16* n6 ^; P3 W$ Y- Y3 {
  17& U6 i: i3 `: o2 X
  18
8 ]) [2 i. ^: |/ h  19" k: @& c2 d* Q$ Q- i; p) {0 M/ ?
  20
) R" ?# ^, K2 ~& r1 o  21openread(string uri)
) ~% v' r5 j; `7 M5 L2 g  #region 读取指定uri的html
$ s( K- q3 A6 B1 q3 ]& J1 w/ s  ///4 U& p  N! F* N9 w

; L5 l% u/ U& s6 l9 n( D  /// 读取指定uri的html
8 p) f0 b7 t6 y6 p  ///
1 H! [+ ~, c/ Q9 H! b; n. D9 B
- t! w* D' N5 L
5 u' h% H1 i# f" e$ k+ @9 D: E  ///
* @1 ?( }  j! i% ?3 q  ///
0 j! u( O2 R1 e9 r$ ?7 D- d  private void button4_click(object sender, eventargs e)7 A9 h5 [0 O+ ?5 |/ u, T4 T
  {# z2 g5 o" s  l; k2 p# i5 p% ]5 R
  webclient wc = new webclient();
! ~. |. G& U+ s3 B3 v2 p4 ]  string uri = "http://127.0.0.1/rss/sina.aspx";
) B0 t  I6 z6 i4 Q9 y  stream stream = wc.openread(uri);
: S9 K  s  |* M$ D& Q  streamreader sr = new streamreader(stream);
: k% _  m  p1 Y  string strline = "";$ K5 [- w; r* ]3 w- Z
  while ((strline = sr.readline()) != null)
" U3 C$ K, ^3 {: m' G" C6 ^4 b  {% P$ f& J" i. H: O
  this.listbox1.items.add(strline);
6 Z: a. E& G6 C  ?' c0 ?+ ?: u( ?  }
- f" E+ J+ J' ?* j- Y2 N* f  sr.close();: ^5 n9 i# ^/ ~" p# p. K2 S
  }& o$ \: q4 Z! K8 r  K0 c" F
  #endregion
$ h" M/ g) R$ E9 P4 W$ b, F  示例:openwriter(string uri,string method);; d$ l& l. L; g2 A
  ?
2 ~9 A" {4 a1 T* g% m  1: H" K0 k6 W8 D* T' n. v
  20 }/ A# E+ d1 |/ x' q8 D
  35 u9 u( C( B9 n( d* |
  4
, V; p7 p9 T# }: C0 D0 V. x1 H; F' s8 z  5( F+ c3 Y: g2 l% W  n' M
  6
7 u. d% d4 l+ f% l1 Y! O+ w( m  7
" y! j9 w6 J" H  8
! d4 k( z* W' j$ T8 g$ X& X  9
" Q9 f' s5 Q3 Z0 M+ @9 Z  10
0 i+ j, ?1 \# g9 W  11
2 j: [" `. B. d0 g3 \  12
/ E- n" s, P- e7 u$ B  132 p' X& O1 g5 w, b9 f! Z
  14
" ~7 I# q4 k" H! y; s( k& ]0 t  15
/ h, |- U3 X3 v/ f1 h) o  16" {) U5 K! v& ~% \6 ?. U
  179 ^" }8 N7 p8 t/ v
  18
! U1 ]3 p' w1 c$ d0 k  19openwriter(string uri,string method)
3 A% ^& ^% _) z' p9 ]. d  #region 打开一个流使用指定的方法将数据写入到uri
. B! @5 L% Q* k) h* o( @  ///
7 R& _" y) Y+ y! |7 s* L4 [
# }8 L- C: S) x& F6 h- k7 Q2 X0 j  /// 打开一个流使用指定的方法将数据写入到uri" d" r8 k# ?( u& l6 r6 b
  ///
; c7 }( H6 ^; }: M# ^. n- A, Q, I, q1 O+ {. W
: f3 }! q( m/ J- h6 z6 J. M
  ///
3 \  }. c) b& ~) y. l; k9 d  ///5 Q  P* _+ P, V0 ?3 F
  private void button1_click(object sender, eventargs e)7 @) Z0 X7 Z3 K. X# r' v
  {
$ W- B0 B$ {' {! b/ d  x  webclient wc = new webclient();* Z: V+ F: K# W" F  f* \
  string uri = "http://192.168.0.35/cims30/rss.txt";
0 a: C- m- I% Z  t" S6 V& v3 S  stream stream = wc.openwrite(uri, "put");
# V- M" u9 D! z  streamwriter sw = new streamwriter(stream);" e8 g5 h& M# U- {  S' T$ S5 g
  sw.writeline("helloworldhelloworldhelloworldhelloworld");+ A. O( Y: z9 t* M8 t6 \* d
  sw.flush();  J9 T  S+ M4 S  i: D' ^5 D( P: U
  sw.close();; o% u% |- A( w. w/ F% l
  messagebox.show("ok");4 w$ F8 W' L8 g+ R: {
  }7 z2 v; X* D% G2 V  p. K- |+ ]) x) s
  #endregion
& b. \1 e$ }$ Z1 h" P) O  openwriter方法返回一个可写的数据流,便于用户把数据发送给uri,可以指定用户把数据发送给主机的方法,默认是post,上例假定0.35的服务器上有一个可写的目录刺马s,这段代码是在该目录下创建rss.txt文件,其内容为“helloworldhelloworldhelloworldhelloworld”
( j7 w- d" E/ x% k  上传文件
2 z- E! z  d, a5 y" |. @2 H  webclient类提供了uploadfile()和uploaddata()方法,在需要投递html窗体或上传整个文件时候,就可以使用这两个方法。uploadfile()方法把文件上传到指定的位置,其中文件名字已经给出,uploaddata()方法把字节数组提供的二进制数据上传到指定的uri;- v( v/ O/ y+ U5 J5 @7 t
  示例:上传文件( h$ E; t( O% X( a
  ?
3 W6 M9 i) \% j( _( T; P! i8 ]1 M #region 把本地文件上传到指定uri
/ t8 v6 f8 L" M* J: X  ///
6 R5 b4 \1 q: G0 c9 i$ c- m, T% j) I , K- Q( E5 N& ?
  /// 把本地文件上传到指定uri
6 @8 k1 ~. H, d  ///: Q8 m5 z! }  W

$ e3 g- V5 i) A8 @ 4 J: e2 @! Y. O9 I
  ///" X0 A% ?7 q. I( A( [# e
  ///8 q/ @$ E) y1 v
  private void button2_click(object sender, eventargs e)
1 l9 }  q. q0 ]3 h" y" A  {
# p% ~$ r3 ]2 [  webclient wc = new webclient();; K$ S8 L! Z9 F" F, v
  string targetpath = "http://127.0.0.1/rss/data configuration.zip";
2 L$ p6 L/ d0 V  string sourcepath = "d:\\data configuration.zip";
+ ^# Z$ z7 _4 X( E" P" g7 e& E8 z$ W' `  this.label1.text = string.format("uploading {0} to {1}", targetpath,  sourcepath);  G4 q, z) o: `0 {; s# E0 C
  byte[] bt = wc.uploadfile(targetpath, "put", sourcepath);0 J- C$ R! g3 z; c: j8 o$ g8 w
  messagebox.show("ok");; p, N4 w# j! F4 v9 e$ G8 [
  }6 G7 s9 r  D2 Y) `; m9 a
  #endregion. I  w  v3 |) }$ o7 {4 `
  #region 把数据缓冲区上载到指定资源% C# |( D: k# d! i+ A/ }
  ///
. Y7 r/ e) r& y; v0 G& m 7 S4 h7 c7 Z4 e. f
  /// 把数据缓冲区上载到指定资源
4 n+ ^, x9 P# I# w/ D& l  ///$ ~# l& S1 K& p" \8 U! u

/ K! X7 R$ N% @6 R: |  R 0 B7 z$ E  {" a
  ///
0 F0 ^8 p; f$ s' r9 a* ]' }3 r  ///& ?, e+ k7 t( F& N  K$ a
  private void button3_click(object sender, eventargs e)7 E( h# l4 F/ C- }) F
  {
+ s! |2 }, T% C. z2 t1 Q  webclient wc = new webclient();
5 ^1 q( l1 S/ U. [: x$ ^  string targetpath = "http://127.0.0.1/rss/kaifeng.jpg";5 I, R2 S6 q3 ^8 @) D/ [
  string sourcepath = @"c:\test.jpg";
9 i/ _$ `, ]* {5 `  filestream fs = new filestream(sourcepath, filemode.open,  fileaccess.read);
( Y& Q& z5 r# m( N7 a3 ]! R2 A. Q0 b  byte[] bt = new byte[fs.length];" `: G: r% k& R! r% Y8 K
  fs.read(bt, 0, bt.length);
* Q9 M+ B4 G2 L3 Z4 ]  wc.uploaddata(targetpath, "put", bt);6 _# C8 Y$ [$ V: e
  }& u# ]0 l4 I. N4 R
  #endregion0 R8 c/ U& l/ X8 e4 P$ H; @* E
  webclient功能有限,特别是不能使用身份验证证书,这样,上传数据时候问题出现,现在许多站点都不会接受没有身份验证的上传文件。尽管可以给请求添加标题信息并检查相应中的标题信息,但这仅限于一般意义的检查,对于任何一个协议,webclient没有具体支持,。这是由于webclient是非常一般的类,可以使用任意协议发送请求和接受相应,它不能处理特定于任何协议的任何特性。
! U  u' Q; A& L7 w! {; a# Z# r更多技术文章信息请查看: 技术文章

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