返回列表 发新帖

c# webclient类用法实例

348.9k 9
swmozowtfl 发表于 2015-7-10 20:45:25|湖北 | 查看全部 阅读模式
  这篇文章主要介绍了c#  webclient类用法实例,本文讲解使用webclient下载文件、openwriter打开一个流使用指定的方法将数据写入到uri以及上传文件示例,需要的朋友可以参考下$ [& I# B' e* c% x/ j: Y- j
  进来的项目中要实现能够在windows  service中调用指定项目的链接页面。由于访问页面时候使用的是ie浏览器或其他浏览器,所以想起用webclient类。
/ e1 n* E# k1 l, I  d8 ^  如果只想从特定的uri请求文件,则使用webclient,它是最简单的.net类,它只用一两条命令执行基本操作,.net  framework目前支持以http:、https和file:标识符开头的uri。
6 m) k! x( Z9 Z0 d: y! {5 J  webclient下载文件$ h( H0 S9 e) P
  使用webclient下载文件有两种方法,具体使用哪一种方法取决于文件内容的处理方式,如果只想把文件保存到磁盘上,使用downloadfile()方法,此方法有两个参数,即请求的uri和请求文件的的数据保存位置。
0 U+ j5 [- E! Y# o  更常见的是,应用程序需要处理从web站点检索的数据,为此要用到openread方法,此方法返回一个stream对象,然后,可以stream对象从数据流提取到内存中。
( t; a0 ?5 c+ ^/ O  示例:openread(string uri);
3 C: S8 l1 j, @1 T) `4 Z  ?
/ F: b$ G: N8 m- R  1; `! E: d1 U$ W: k7 Z) x
  2
8 @$ o0 n. n" I% @! s  3
% P$ j  s- I4 s+ D& \- @1 L5 w6 y) B  4: T" `  b" n* k$ ?
  5
* U7 u8 h2 k9 O6 J7 c$ i' s! p4 M  6
9 T0 Y/ y- E# f4 o  7
& i2 a6 v- r- S1 k- x/ J$ Z  8& z9 |# [5 J7 h  G+ f# r: u' t
  9, J/ T. J' {. M, i; y
  10- p) [! D- m$ ^  V/ Y* w
  11; ]' g7 w! P9 a* T
  12
3 A1 a4 O) q. |  13  j4 p+ b! S  C
  14
) _8 w2 f7 E4 Z( u2 i& n  15& Y; v4 p  |, x
  16! e8 K+ n) a, u0 {5 j: L( {: y
  17% K1 B& i3 P( g7 i
  18, f2 {! G  f1 K4 L0 x
  19
5 J) X5 ^& U, J- h# x, @/ U. A' t( s  20
5 ^) L0 l) M+ `: W  21openread(string uri)
' f) q1 V9 m5 ~, r0 c) R  #region 读取指定uri的html4 y' I6 H- r4 o) C
  ///
, W* d" }: o" x! j
8 S: ^5 T+ ~/ p+ l0 q  /// 读取指定uri的html
% Y& b& d( R8 q0 E- g  ///& a# H% j( g/ ], u) Z* g+ X' {6 w

) Y, m* |7 k4 W7 G7 W5 E: }
/ y: ^1 m* Q: [8 w8 A" |& L* l! Y; S" O  ///
' t& @" ^: O3 M, r* k% R  ///2 P$ y* q- g; b: A. A
  private void button4_click(object sender, eventargs e)  P! i4 ]: o. u2 T) p
  {
, U. t" d) W3 h7 y; x& V% y1 r9 q  G2 u  webclient wc = new webclient();' @% M) @# B( K" i$ n1 Q, j5 v
  string uri = "http://127.0.0.1/rss/sina.aspx";4 Z! C* J: J, _. f8 j
  stream stream = wc.openread(uri);/ C7 h4 U4 d  r" R
  streamreader sr = new streamreader(stream);' \& J' {1 |" e! G8 I. n: T
  string strline = "";
/ w! d  X: X) ?* e1 }9 \# @, S  while ((strline = sr.readline()) != null)
; g1 d3 G. x- m( t, `* u- I1 R  {; @' t7 a( x3 ~/ q8 C6 I$ v9 f
  this.listbox1.items.add(strline);
+ i6 \, E+ P8 D8 Z  }3 ~9 Z8 P7 U( w+ `! H" ^, |$ ^1 |
  sr.close();
, V4 v- ]* R! Y3 W$ g# `, J, k  }
. _7 |) [, _( B6 t. {  #endregion7 k" U! P7 Z4 D4 F) E7 C! ~
  示例:openwriter(string uri,string method);
, f% j6 c5 l/ K8 j0 H- i( P! c$ }$ U  ?1 M8 i- D7 F& _$ H" C* q! X/ {
  1$ _; g$ t" s  N1 d
  2: G7 J5 e3 E  N# P- k2 C+ e; Q4 p
  39 V% E4 M1 A# _0 _' @- L
  4
. I6 z( Z* N0 j2 c. o+ _) S  53 l9 u7 j7 Y' H' f3 p& O0 C
  6
8 y. w  a* v" ^! }: D  7
: S/ K) a) `0 m$ o& Y) h6 G  86 v& X; d- @; K: X+ q; g/ p
  9
' O$ K. ^/ n# R. F4 h  10
8 B+ }0 \2 y# Y6 B  116 O4 q7 |8 [9 n+ a+ P1 _
  12" e, |! T: e) J( }
  13$ N' k$ }4 ~( `+ d
  14
; Q5 i! n) S, S- [/ [  15# h: Z, ]# |9 P9 U
  16
" b9 C+ F7 j7 [0 e6 ^( a  178 s2 k2 v+ r& ~' o) ~$ H9 K" A$ N
  18( U8 X; l/ O" Y: E# e* j1 i
  19openwriter(string uri,string method)
4 L1 [4 n, e* f" q  #region 打开一个流使用指定的方法将数据写入到uri
4 u5 J4 d3 X1 X1 N2 G  ///( G/ e; H- [2 o2 H) o5 E

  e, l0 U4 Y$ g  f  /// 打开一个流使用指定的方法将数据写入到uri
8 a7 K  o% S, J7 Z& K: }( O  ///
0 h+ P" ]- a( P) a; P& A. G7 Q1 u* f' Y7 ~; y9 Q) W

9 Z8 o' \& _- y; ]2 |  ///
  b' T. z' m1 o" t; c  ///
+ Q: L" L( ?' s! O  private void button1_click(object sender, eventargs e). h/ K2 T6 l( C, |" _
  {1 \1 F% A  t9 Z* c, I1 h( R
  webclient wc = new webclient();
7 l# [% I: [. _) w) z- m0 k  string uri = "http://192.168.0.35/cims30/rss.txt";
! d1 E6 q9 m9 o  stream stream = wc.openwrite(uri, "put");( ~- h5 O3 {; [0 S$ u
  streamwriter sw = new streamwriter(stream);
9 R+ O1 q: O8 V. k4 w  sw.writeline("helloworldhelloworldhelloworldhelloworld");
; k; H1 y! E4 E; w( d$ A, P  sw.flush();% T, E  W# n4 V: v. y, r
  sw.close();3 F* {5 }5 A( F$ f. W+ M
  messagebox.show("ok");
7 \( |! \2 `, L4 ~/ P  }' b' B7 @" ~- u8 A
  #endregion
/ O2 t; z* M& S0 i. ^  openwriter方法返回一个可写的数据流,便于用户把数据发送给uri,可以指定用户把数据发送给主机的方法,默认是post,上例假定0.35的服务器上有一个可写的目录刺马s,这段代码是在该目录下创建rss.txt文件,其内容为“helloworldhelloworldhelloworldhelloworld”
3 S9 M2 P1 \4 f$ c- O& z/ W  上传文件# o. I$ c1 `0 A: M# t
  webclient类提供了uploadfile()和uploaddata()方法,在需要投递html窗体或上传整个文件时候,就可以使用这两个方法。uploadfile()方法把文件上传到指定的位置,其中文件名字已经给出,uploaddata()方法把字节数组提供的二进制数据上传到指定的uri;) p$ J% y% x' J) j  m
  示例:上传文件
5 X$ |: K  s; A" V: [: v/ v' c  ?- f# O( T& Z- J7 @
 #region 把本地文件上传到指定uri
" H3 u4 O5 h; _  ///
) _4 x& Z; C* D6 Q( W! `  s 6 J, D# v$ k: L
  /// 把本地文件上传到指定uri
% J# {' E* O0 v; F  ///; d, _- T5 Y! s8 N& Q. y

/ E0 S. ~( b, }9 D8 }
/ a  u9 g- v* w* }# L4 O. z  ///
4 U& N; t+ w* ^0 O6 L7 j  ///
3 u' g; O6 U* a  private void button2_click(object sender, eventargs e); r1 k+ ?# A0 G! ]- H1 Z- i. o! u, y
  {
( ~6 t7 H2 ?+ O  webclient wc = new webclient();
, f" ~# Z4 A( s, B' c: S) m  string targetpath = "http://127.0.0.1/rss/data configuration.zip";
8 Y4 p5 D; j3 r! Z9 u9 u. D  string sourcepath = "d:\\data configuration.zip";' J4 I+ G$ _; q$ U( Y$ C
  this.label1.text = string.format("uploading {0} to {1}", targetpath,  sourcepath);
3 O# `# l) H  P* P7 @$ H  byte[] bt = wc.uploadfile(targetpath, "put", sourcepath);
+ g3 o: e. D+ M+ e5 C  messagebox.show("ok");# J7 O6 H7 Q: c0 `8 N
  }" ^+ p2 @! B; A
  #endregion
0 d$ x. s; a  ^( [- K& C  #region 把数据缓冲区上载到指定资源5 m/ t( a$ F6 U+ F0 M% m/ g
  ///% H. a4 X+ F( y2 m
0 ]. V; C: K4 i' v! V3 F+ J) m% c& G
  /// 把数据缓冲区上载到指定资源
  @  j& I$ ?! o  S! g$ i/ f$ q  ///5 o* j4 ]/ g# H4 i6 N8 T! R
8 w0 h- Q9 F) V8 s) J8 N# R# m

" B! ^  h  K/ [: C8 d: w  ///! F9 L9 v6 W, {* A
  ///
. A) F: M# @- \+ t% v  private void button3_click(object sender, eventargs e), V' ]. m5 j6 O: _8 r0 c$ F
  {
  _8 a+ b: s. a! K* A  webclient wc = new webclient();) j3 O- k% K. g  Y, O
  string targetpath = "http://127.0.0.1/rss/kaifeng.jpg";
, O' e4 z; D: `: S7 r% Z' F7 J  e  string sourcepath = @"c:\test.jpg";: X% X( b& x$ ~9 [& l* w& @
  filestream fs = new filestream(sourcepath, filemode.open,  fileaccess.read);5 M0 u- w' u5 J4 n( s
  byte[] bt = new byte[fs.length];/ s9 T5 x9 v; u$ G) P! X
  fs.read(bt, 0, bt.length);
, L, `- @' K* L$ |& k0 Y  wc.uploaddata(targetpath, "put", bt);
8 {' |3 I) G. \, E8 [# @1 u' N  }
& Y+ n! V& X% V$ \+ D# U- F  #endregion
% ~9 E: c! \6 ]$ e6 H6 L  webclient功能有限,特别是不能使用身份验证证书,这样,上传数据时候问题出现,现在许多站点都不会接受没有身份验证的上传文件。尽管可以给请求添加标题信息并检查相应中的标题信息,但这仅限于一般意义的检查,对于任何一个协议,webclient没有具体支持,。这是由于webclient是非常一般的类,可以使用任意协议发送请求和接受相应,它不能处理特定于任何协议的任何特性。
( u6 b0 Z4 ^' n更多技术文章信息请查看: 技术文章

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