返回列表 发新帖

c# webclient类用法实例

348.6k 9
swmozowtfl 发表于 2015-7-10 20:45:25|湖北 | 查看全部 阅读模式
  这篇文章主要介绍了c#  webclient类用法实例,本文讲解使用webclient下载文件、openwriter打开一个流使用指定的方法将数据写入到uri以及上传文件示例,需要的朋友可以参考下
6 h1 B- y$ p( g* a( o  进来的项目中要实现能够在windows  service中调用指定项目的链接页面。由于访问页面时候使用的是ie浏览器或其他浏览器,所以想起用webclient类。' j  a+ F" j" i$ A! Q  Y$ X5 _
  如果只想从特定的uri请求文件,则使用webclient,它是最简单的.net类,它只用一两条命令执行基本操作,.net  framework目前支持以http:、https和file:标识符开头的uri。
5 r+ c  a; ?* g3 L4 Q0 D  webclient下载文件
$ I3 w) l6 X  U$ k5 a  使用webclient下载文件有两种方法,具体使用哪一种方法取决于文件内容的处理方式,如果只想把文件保存到磁盘上,使用downloadfile()方法,此方法有两个参数,即请求的uri和请求文件的的数据保存位置。+ ?+ U+ U+ M% O
  更常见的是,应用程序需要处理从web站点检索的数据,为此要用到openread方法,此方法返回一个stream对象,然后,可以stream对象从数据流提取到内存中。+ l0 ]( `! H" T. h" h, U* z/ p2 z
  示例:openread(string uri);  _0 y2 A  e5 @1 h) l+ h
  ?6 V' C! q$ z! l# Y$ i4 w. ?) }, e
  1
! t* u" d- k+ T7 f" s  2
: d% \. I4 Z1 m/ s2 |( I$ U  3% |7 ^$ p' i5 H- o5 v- X
  4
1 i$ n" o/ M6 F  5
  Z- o6 V5 g' U6 @  6
8 `. Q9 e: E* k( D. w, L& K' t: B  7
' u# m1 Y" ~: f& Y' P. B( \8 ]. C: v  8
+ x, p4 S4 e0 B6 `  90 ~, S. s' R) l
  10
- P" b9 E" s9 M1 j8 G  11# d$ g: @" y9 J9 c1 U2 i' m
  12
9 ^! g( u' j7 [$ e. f3 A2 J  13, u" l! ]& ?0 X
  14
' h) }5 n* h. h  15
$ z* K' K! }7 Z# u3 I0 X, r  16, L) {3 r0 ~1 V; Z: M8 r5 n* E6 v
  17- v- [& @" l! A! n9 x, n1 ~
  18
* y1 ^  l4 m6 M2 R. s; c  19, B1 R: g7 k4 p! M
  20
2 S0 V2 l! K0 |$ K. q5 n" H  21openread(string uri)
) t8 V# t) Y8 U3 ~  #region 读取指定uri的html+ Y$ z; i1 E2 d: q2 A7 P
  ///  S, m% H5 J# `, m2 O
4 |- \5 X) J8 ~
  /// 读取指定uri的html) V$ F7 q$ D4 }. O6 `
  ///5 @5 \9 S! e+ ~4 W' ]

1 F. m) p3 B0 {; O: m 6 i9 K' E1 i8 Q' I2 m- S# a
  ///$ k3 Q8 }2 S- I% w( B8 H4 X
  ///
7 Y" z, A, A4 ]4 R' d  private void button4_click(object sender, eventargs e)( P( ]0 U! X1 ^. B5 l$ [% I
  {% o. r1 M8 f: r0 {0 \
  webclient wc = new webclient();
- q& t; ~7 c- p5 f+ E  string uri = "http://127.0.0.1/rss/sina.aspx";4 X; V' V% l2 T& N0 X
  stream stream = wc.openread(uri);7 h) z6 g& e/ j* c2 V' _7 x# K
  streamreader sr = new streamreader(stream);
/ C9 Y& m% h8 r5 Z! K  string strline = "";( o' y, i3 Z6 w2 c5 X2 A% [; |
  while ((strline = sr.readline()) != null)3 O8 k% L' M6 y- C
  {9 D4 z9 W  f) u/ F
  this.listbox1.items.add(strline);( e1 o2 R' w! B3 \1 E) Q9 J8 M& K
  }
( Y. l1 ]7 T6 L1 {( l& A  sr.close();' i6 F9 g: A# `) L9 x
  }6 x4 w5 h) Y; i- J6 Y2 ]7 Y
  #endregion, T" D' J+ v: W1 x
  示例:openwriter(string uri,string method);: d/ V7 w+ o4 I2 W, U
  ?
: T* j9 Y. G! {  1
- @  T3 [/ }5 ]: S( c  2
" `5 r6 T$ H# {  3
, l3 C0 E5 `/ o3 _  4
! M2 g7 M5 O5 ~% H7 \  5
4 t8 e7 d% a8 x  a  6
5 v; D6 [2 X1 ^  W  7
% s4 A+ w5 r7 S/ `6 C8 t2 P. h2 H  8
! {8 J' T4 X" y( M" N, R7 Y  9
3 T: @( J' v  J- G' |  10
' H6 E$ e- M3 t5 @% w  119 u* ~3 `1 r/ n
  12$ z& f. I' |& \# C
  13
( N; V6 J4 r/ }! z; M7 w9 }. @' }  14
( w" _) x# x) J  O. c( x" M1 k& n6 z! P; E  153 }; h; N8 v! I, R' X! W
  169 h- o1 z# F2 f$ [$ R& ^, o; G
  174 B) z0 Q4 N  p) b
  18
+ d2 a2 u" R, O# H8 L. b  19openwriter(string uri,string method)
0 m2 r, n( |9 q: o! f# m$ c$ y1 t) k  #region 打开一个流使用指定的方法将数据写入到uri- A+ n( d# x3 S6 r
  ///
: [6 n8 S: z0 G1 l# |6 A' a 9 q$ Q1 ^( E7 V5 G
  /// 打开一个流使用指定的方法将数据写入到uri! f, g$ U* W8 C1 M/ w
  ///
, N* B; j4 I. v- w' W0 P/ F/ w9 d8 y( D$ ^! C/ Y" J# ]  G% a4 D
% G( F; _+ k4 l5 A" x& k2 V. A; B
  ///7 X9 c- G1 F3 g) j& n4 H7 n8 A. q
  ///6 L) \; z- c0 ?+ G/ e1 N; ]+ M
  private void button1_click(object sender, eventargs e)
  r, W" h5 _0 t2 S+ q  {, w: @6 B. X8 e4 ~8 }0 l
  webclient wc = new webclient();
2 j( v0 q' u6 J  n% n  w  string uri = "http://192.168.0.35/cims30/rss.txt";" s# E+ ~4 z7 i( _4 A. u1 |
  stream stream = wc.openwrite(uri, "put");5 g- ^0 B1 L7 Q9 v1 T
  streamwriter sw = new streamwriter(stream);- n" C8 b# i9 Q* b
  sw.writeline("helloworldhelloworldhelloworldhelloworld");
) m. G* b! u" s  Y" ^  B$ J7 R  sw.flush();+ X* `. P- a1 F% L2 a: e$ |& }8 z7 G
  sw.close();* f$ D6 V. W* ?& o1 O
  messagebox.show("ok");+ ?* g+ n) e  c* T1 Z3 i* U
  }
1 B$ ~" d7 D4 q3 d& d8 ]  #endregion
$ W: A& N' V* N2 P6 p  openwriter方法返回一个可写的数据流,便于用户把数据发送给uri,可以指定用户把数据发送给主机的方法,默认是post,上例假定0.35的服务器上有一个可写的目录刺马s,这段代码是在该目录下创建rss.txt文件,其内容为“helloworldhelloworldhelloworldhelloworld”
% R4 ^& D) ~" Q& a% d  上传文件
& k) `/ t% ~9 V* }8 z7 r  webclient类提供了uploadfile()和uploaddata()方法,在需要投递html窗体或上传整个文件时候,就可以使用这两个方法。uploadfile()方法把文件上传到指定的位置,其中文件名字已经给出,uploaddata()方法把字节数组提供的二进制数据上传到指定的uri;
4 a# A) Z; f* m2 y8 N* @; N) T4 r  示例:上传文件
) [  M: I' R2 c; [8 x1 e9 g  ?' s5 z* O7 B0 k1 j. y* h; I/ q; m3 R
 #region 把本地文件上传到指定uri$ A6 s" n# _! p
  ///
, l) L# N( u7 l$ }
6 S; j7 g9 ~# y- g- {& ^  ]) c* r  /// 把本地文件上传到指定uri
) x0 I! R3 m6 N0 e9 m" J( `3 P7 c  ///( r( p8 `8 k8 J. W( q9 V
% e6 P  I3 R3 \! w0 l' }

# Z5 a! U, {0 L  ///
4 g  J9 G8 ]5 E& F$ _  ///' E& V2 K  V# @5 o' ^' m) h) D
  private void button2_click(object sender, eventargs e)
; E% d. D/ M5 K. z0 Z! d" }1 J9 J  {# i) q7 L% F/ o- D6 ?
  webclient wc = new webclient();
+ E5 b* d: z1 q- |# [8 T# d  string targetpath = "http://127.0.0.1/rss/data configuration.zip";
8 j9 x7 `5 ?( O- ~- m  string sourcepath = "d:\\data configuration.zip";
" S# G. ]9 U7 h  this.label1.text = string.format("uploading {0} to {1}", targetpath,  sourcepath);1 H7 |. W: X$ ~, G0 u9 T4 o" Q# H
  byte[] bt = wc.uploadfile(targetpath, "put", sourcepath);
% U# O( ?; ~( s% M; ]0 X  messagebox.show("ok");# ]  B+ N) t. }* K7 E
  }( v$ M2 M+ r: H" y- n
  #endregion# ?( r& K+ Y1 R& N
  #region 把数据缓冲区上载到指定资源
4 |8 p6 d5 n8 F& \  ///
$ f" w9 k: a8 z
6 s$ |+ c: {+ V, v  /// 把数据缓冲区上载到指定资源
. K+ |9 f8 i& K0 |- a) F% U  ///
4 @! q5 o; b2 s$ f. j" Z
/ _5 e0 D' n1 V7 q( O. l; _% U7 Z : e' W+ t: ^( ?# f
  ///
- j8 @1 t* }, f( c8 g( y  ///
3 l  y# U3 V  j- h  private void button3_click(object sender, eventargs e)! j- K+ J; n4 A4 C" c0 F
  {0 n5 h7 F! l: @6 ]. M
  webclient wc = new webclient();
' P9 a1 N5 v6 }/ e+ [1 D' O: o  string targetpath = "http://127.0.0.1/rss/kaifeng.jpg";+ v% i  A5 ~- Z; \4 |* J3 H. ~& N1 W
  string sourcepath = @"c:\test.jpg";
" U( @/ K- [* S. k7 p  filestream fs = new filestream(sourcepath, filemode.open,  fileaccess.read);1 _# }# f+ t5 B0 B
  byte[] bt = new byte[fs.length];
4 E( s; ]2 a+ f2 E1 m- n1 k  fs.read(bt, 0, bt.length);; k+ A0 r3 e& q* d6 E
  wc.uploaddata(targetpath, "put", bt);3 _3 Q" d+ E6 {+ S2 T, g* s
  }
0 S/ F. `% |& A. l6 k7 v  #endregion
9 d$ F. X# Q; e3 p- l" G  U$ D  webclient功能有限,特别是不能使用身份验证证书,这样,上传数据时候问题出现,现在许多站点都不会接受没有身份验证的上传文件。尽管可以给请求添加标题信息并检查相应中的标题信息,但这仅限于一般意义的检查,对于任何一个协议,webclient没有具体支持,。这是由于webclient是非常一般的类,可以使用任意协议发送请求和接受相应,它不能处理特定于任何协议的任何特性。
$ o5 b, r( C( |3 t- 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 站长技术交流论坛|互联网技术交流平台 版权所有 All Rights Reserved. Powered by Discuz! X5.0 鄂ICP备15006301号-5|鄂公网安备 42018502006730号
关灯 在本版发帖 扫一扫添加QQ客服 返回顶部
快速回复 返回顶部 返回列表