返回列表 发新帖

c# webclient类用法实例

348.8k 9
swmozowtfl 发表于 2015-7-10 20:45:25|湖北 | 查看全部 阅读模式
  这篇文章主要介绍了c#  webclient类用法实例,本文讲解使用webclient下载文件、openwriter打开一个流使用指定的方法将数据写入到uri以及上传文件示例,需要的朋友可以参考下
; k' Z0 |* w2 n3 S  进来的项目中要实现能够在windows  service中调用指定项目的链接页面。由于访问页面时候使用的是ie浏览器或其他浏览器,所以想起用webclient类。1 t# Z+ q9 ~. B3 }3 ?& t6 t' j
  如果只想从特定的uri请求文件,则使用webclient,它是最简单的.net类,它只用一两条命令执行基本操作,.net  framework目前支持以http:、https和file:标识符开头的uri。! j; Z+ o8 c& r- L
  webclient下载文件
, I2 o# R6 E3 W/ o9 E  使用webclient下载文件有两种方法,具体使用哪一种方法取决于文件内容的处理方式,如果只想把文件保存到磁盘上,使用downloadfile()方法,此方法有两个参数,即请求的uri和请求文件的的数据保存位置。
0 c% M6 n  g. J  更常见的是,应用程序需要处理从web站点检索的数据,为此要用到openread方法,此方法返回一个stream对象,然后,可以stream对象从数据流提取到内存中。9 ~6 N" t5 F5 H$ |5 R
  示例:openread(string uri);
2 b4 ?% a8 r  J  U. v  ?7 C( c# k, H1 J% E( i; p
  1/ `0 B0 e7 N0 `7 h4 M
  2
$ O  C8 |% p6 M  37 b7 \( B4 t; g* ^# I; |
  4/ j& s" [1 |6 ]' J. ~: d
  5
; [3 G: {9 w/ F$ [0 i  6  d  `! n( y( C: t0 y
  7  S; \# Z1 W. e; R+ n3 d
  8( r& c' q1 w, F, \+ l/ `  W: _
  9
  o$ Y/ u1 I6 n! \  10
( v' S- D3 O9 M4 \. o0 X9 ~& y  112 T( J# ?) n7 X% Z
  12
- P4 S  _1 ?/ B6 E5 a' Q0 ^9 F  13
9 l# K+ n! M- P8 a, T8 l( L+ a  14
. R9 p# F" s2 a  156 Z8 b9 @6 Q3 y5 E4 Y4 f
  16
- t; f' w2 O& @0 E  17
* r  y9 p( M1 d  V5 F& K* ]* ~$ n$ U) `  185 }5 i/ F# ^, C5 X- _- k
  198 u# P2 Y+ `7 x8 C2 a8 y# f; b7 i
  20/ B1 \4 }, V! k3 x9 ?
  21openread(string uri)  Z1 l7 Y9 ~& \
  #region 读取指定uri的html7 T, u! H8 \2 N
  ///
% H2 H# d4 i/ v, d' H% l / B$ T- q& B  W! M
  /// 读取指定uri的html$ j3 o% C- R* F+ H
  ///0 I6 {: C$ q2 S( V2 Z" p* C

% F! |3 c, N5 e" G5 B0 R8 ^ 7 F' ^2 q0 Z2 d7 _# ]) ^* w
  ///3 X0 C% j$ B# @- a$ r
  ///
5 k+ c( V1 N- g2 N. R8 V; c6 ]# s7 ]  private void button4_click(object sender, eventargs e)& K. [* y! S, H+ `
  {
: `3 @$ P5 s$ n" C  webclient wc = new webclient();  b1 S4 l5 m) n" j- D
  string uri = "http://127.0.0.1/rss/sina.aspx";
( V' W4 I% p. L% g+ e  stream stream = wc.openread(uri);2 z4 y4 u& U7 ^8 f  ]$ }
  streamreader sr = new streamreader(stream);
* Y0 n, e5 X" L* b5 o+ U8 r  string strline = "";) }9 h. {% g) h4 X( r
  while ((strline = sr.readline()) != null)
& P+ @( w1 W3 D! a* H# r  {
! v7 [8 O3 M5 O' s9 m" s" S  this.listbox1.items.add(strline);
! h6 S, z* j9 M, h' b  }: O% Z% P! `& d3 p0 E2 Z& U; b
  sr.close();
5 q& w# W! ?$ e+ _  }
( ?4 G9 f* v1 T% }  #endregion
  {4 O0 E# c( D6 @  示例:openwriter(string uri,string method);
. Q+ W9 p( R* t0 ]2 D7 u1 W6 I2 T  ?) H! J) W7 f9 t' l1 c
  1
+ u5 L; z+ ^. S  2
" c& N' m% E1 q$ l1 O  34 P! k; F, a2 I! W/ A6 c0 n/ r. k
  45 f8 a7 U7 y; c
  5
$ O' _9 I" p0 C/ p  6
0 M6 L9 P7 d9 j* ~6 S  7! a4 G+ K* U5 _  {+ o
  8
" S0 @7 }8 s8 q4 U$ X  91 ^, M0 o0 U& |$ b5 D& {
  10
8 b- b# f3 }$ a  11& Z: B7 z1 j  Z- l* u! B
  12
% ^" p4 y7 i" o. P  13
  z& [$ m6 |8 @% y/ F4 o  14, Q  k! B" E1 |6 Y
  15
6 i9 @% v- O3 B5 r: v! ~  163 x- ^# G) V9 ?9 d( J. m* K
  171 `8 F2 z- X; ]: v% W4 Z  ?
  18
3 Y' n4 w& M, k4 d  19openwriter(string uri,string method)
: ]; D) H# D+ g  p7 q: C+ X. z* w  #region 打开一个流使用指定的方法将数据写入到uri7 J2 {" e% d9 S9 U+ e5 v
  ///
# Q7 C& r. D' g# \" f) Z6 Y
  M) }0 ]* w+ q( s- {3 M+ C  /// 打开一个流使用指定的方法将数据写入到uri# F9 L% `, l7 ~% Y0 A( `0 H8 `
  ///2 [7 F. ?6 o( ^/ _0 \6 i

+ ^0 _) N) ^1 L+ p
* P. l0 R( {. P! x9 h  ///
; L# l# k7 J- X  L8 Z4 }  ///
9 O% Y$ p; y% F. \* j& w, x  private void button1_click(object sender, eventargs e)* m, p1 s& c6 l; d& y
  {
% N8 d% i9 i7 T" s  webclient wc = new webclient();# c2 V# b2 E8 M) o3 A: X
  string uri = "http://192.168.0.35/cims30/rss.txt";
7 }! Y& Q/ {; i  z$ `  stream stream = wc.openwrite(uri, "put");/ y- J4 y" d. A/ J& A
  streamwriter sw = new streamwriter(stream);3 e& s! M1 h! {; s* P6 S
  sw.writeline("helloworldhelloworldhelloworldhelloworld");
# x  q+ f* @( D9 b2 b6 {. R- U  sw.flush();5 A' r( p# X6 w; d7 e; Q' T
  sw.close();
% O, d. l0 |1 C7 H& A0 [! b  messagebox.show("ok");
+ L. W( `0 q, {) v) |  }
( i: y) H# Z6 x% \3 }  #endregion1 a" W5 [$ D1 `5 ?# F5 N" x
  openwriter方法返回一个可写的数据流,便于用户把数据发送给uri,可以指定用户把数据发送给主机的方法,默认是post,上例假定0.35的服务器上有一个可写的目录刺马s,这段代码是在该目录下创建rss.txt文件,其内容为“helloworldhelloworldhelloworldhelloworld”: r* j! r  w6 Z) k2 [' x+ p
  上传文件
( e; j6 S6 Q4 f2 G' V" ]  webclient类提供了uploadfile()和uploaddata()方法,在需要投递html窗体或上传整个文件时候,就可以使用这两个方法。uploadfile()方法把文件上传到指定的位置,其中文件名字已经给出,uploaddata()方法把字节数组提供的二进制数据上传到指定的uri;4 q) h9 S( S1 \" T" f, p
  示例:上传文件$ R% N; ]$ E! m' {
  ?
7 e6 d, |* `) o) `  K #region 把本地文件上传到指定uri% t; w/ Y& U% S$ ?" R
  ///2 B7 Q; u$ j9 K6 o8 e( U

* f! @: g8 ~4 @3 B$ U# D% q  /// 把本地文件上传到指定uri3 k# q& b- h; V" X# l
  ///9 ^( z1 P( a3 n  R6 ^0 _( y

3 J9 ?  a& B5 g1 c * y5 \+ n) s: p' S; e1 M: |
  ///
1 G* G( Z; }5 V* [+ N5 T  ///& M6 S4 j% H# H( F
  private void button2_click(object sender, eventargs e)
- {( S" }" [  n/ g" F5 H% h  {. p% S" Z- D: P$ M
  webclient wc = new webclient();# _% D# u1 F5 z5 C9 F
  string targetpath = "http://127.0.0.1/rss/data configuration.zip";8 _- t" I3 H" H) o/ a
  string sourcepath = "d:\\data configuration.zip";- ?1 j" L& b+ R
  this.label1.text = string.format("uploading {0} to {1}", targetpath,  sourcepath);
0 x3 e3 p3 e# \- L7 l5 Q; f  byte[] bt = wc.uploadfile(targetpath, "put", sourcepath);
- F2 y2 Y. ^1 w% x0 Y! k  q" N  messagebox.show("ok");
$ |  w6 f. K# g  }% S9 Z: f' x% d$ I& }2 o; C  l
  #endregion
. y, r3 |1 K3 X4 u! S) k, n  #region 把数据缓冲区上载到指定资源
7 v6 {1 P# R" j! p6 R  ///
4 L( X2 Z5 e; j5 I( Q8 y/ E+ f
9 a* e& F: S2 B* m0 c! \  /// 把数据缓冲区上载到指定资源8 |  `. Q; D( q7 i
  ///, i8 U2 r& i. ^5 `
( M8 w) s2 q9 U
8 c' h- N6 V% }# n6 a2 ]& j
  ///2 o& Q! X4 R* U& y( l, J
  ///2 t* w! l2 c* }: j6 z# ?+ v
  private void button3_click(object sender, eventargs e)3 ~) O; @' t+ I* s3 l
  {' W+ c5 x' e! y/ ?5 F# p
  webclient wc = new webclient();
7 t( i/ h3 L, K0 ^! @9 z- C1 I1 m  string targetpath = "http://127.0.0.1/rss/kaifeng.jpg";5 U* c1 c6 N$ I3 w, U8 h/ S# c
  string sourcepath = @"c:\test.jpg";
! [: l3 Q: n9 n7 a  filestream fs = new filestream(sourcepath, filemode.open,  fileaccess.read);1 H! ^# b1 ^$ Q6 P  i5 i
  byte[] bt = new byte[fs.length];
% }( [% f& A  L- n  fs.read(bt, 0, bt.length);
2 t- {! U0 u' D" ]( T- Y  wc.uploaddata(targetpath, "put", bt);0 m: [. h; M9 M8 C; t- K" j
  }7 y2 T5 D3 V4 }+ l2 p% [
  #endregion" Q7 \9 d7 M6 p" {6 E/ S. ^
  webclient功能有限,特别是不能使用身份验证证书,这样,上传数据时候问题出现,现在许多站点都不会接受没有身份验证的上传文件。尽管可以给请求添加标题信息并检查相应中的标题信息,但这仅限于一般意义的检查,对于任何一个协议,webclient没有具体支持,。这是由于webclient是非常一般的类,可以使用任意协议发送请求和接受相应,它不能处理特定于任何协议的任何特性。6 _. m0 d% M+ q. k2 F3 T2 f
更多技术文章信息请查看: 技术文章

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