LOGO OA教程 ERP教程 模切知识交流 PMS教程 CRM教程 开发文档 其他文档  
 
网站管理员

C# 网 络(WebClient类)

admin
2025年3月29日 21:22 本文热度 23

本章内容  :
● 从Web 下载文件
● 在Windows 窗体应用程序中使用WebBrowser 控件
● 操纵 IP 地址,执行DNS 查询
● 用 TCP、UDP 和套接字类进行套接字编程

WebClient类

如果只想从特定的URI(Uniform Resource Identifier,统一资源标识符)请求文件,则可以使用的最简单的.NET 类是System.Net.WebClient。这个类是非常高层的类,它只用一两条命令执行基本操 作。.NET Framework 目前支持以http:、https:和file:标识符开头的URI。

术语 URL(统一资源定位符)在新的技术规范中已不再使用,现在更常使用的是 URI(统一资源标识符)。URI 的含义大致与URL 相同,但URI 更通用,因为它不意味 着用户正在使用其中一个熟悉的协议,如HTTP 或FTP。

下载文件

使用 WebClient 类下载文件有两种方法,具体使用哪一种方法取决于文件内容的处理方式。如 果只想把文件保存到磁盘上,就应该使用DownloadFile()方法。这个方法有两个参数:即文件的URI 和保存所请求的数据的位置(路径和文件名):

WebClient Client = new WebClient();
Client.DownloadFile("http://www.reuters.com/", "ReutersHomepage.htm");

更为常见的是,应用程序需要处理从Web 站点检索到的数据。为此,要使用OpenRead()方法, 这个方法返回一个Stream 引用。然后,就可以把数据从数据流中提取到内存中:

WebClient Client = new WebClient();
Stream strm = Client.OpenRead("http://www.reuters.com/");

基本的WebClient示例

第一个示例将阐述怎样使用WebClient.OpenRead()方法。这个示例将把下载的页面显示在 ListBox 控件中。首先,作为标准的C# Windows 窗体应用程序新建项目,添加一个名为listBox1 的 列表框,将其docking 属性设置为DockStyle.Fill。在文件的开头,需要在using 指令列表中添加 System.Net 和System.IO 名称空间引用,然后对主窗体的构造函数进行以下改动:

public Form1()
{
    InitializeComponent();
    WebClient client = new WebClient();
    Stream strm = client.OpenRead("http://www.reuters.com");
    StreamReader sr = new StreamReader(strm);
    string line;
    while ((line = sr.ReadLine()) != null)
    {
        listBox1.Items.Add(line);
    }
    strm.Close();
}

在这个示例中,把System.IO 名称空间中的StreamReader 类与网络数据流关联起来。这样,就 可以使用高层方法,例如ReadLine()方法,从数据流中以文本的形式获取数据。据移动抽象化为数据流概念的优点,这个示例就充分体现出了这一点。

WebClient 类还有一个OpenWrite()方法,它可以返回一个可写的数据流,便于用户把数据发送 给URI。也可以指定用于把数据发送给主机的方法;默认的方法是POST。下面的代码段假定在本 地计算机上有一个可写的目录accept,这段代码在该目录下创建newfile.txt 文件,其内容为“Hello World”:

WebClient webClient = new WebClient();
Stream stream = webClient.OpenWrite("http://localhost/accept/newfile.txt", "PUT");
StreamWriter streamWriter = new StreamWriter(stream);
streamWriter.WriteLine("Hello World");
streamWriter.Close();

上传文件

WebClient 类还提供了UploadFile()和UploadData()方法。在需要投递HTML 窗体或上传整个文 件时,就可以使用这两个方法。UploadFile()方法把文件上传到指定的位置,其中文件名已经给出; 而UploadData()方法把作为字节数组提供的二进制数据上传至指定的URI(还有一个DownloadData() 方法,用于从URI 中检索字节数组):

WebClient client = new WebClient();
client.UploadFile("http://www.ourwebsite.com/NewFile.htm",
"C:\\WebSiteFiles\\NewFile.htm");
byte[] image;
// code to initialize image so it contains all the binary data for
// some jpg file
client.UploadData("http://www.ourwebsite.com/NewFile.jpg", image);

WebClient 类还提供了UploadFile()和UploadData()方法。在需要投递HTML 窗体或上传整个文 件时,就可以使用这两个方法。UploadFile()方法把文件上传到指定的位置,其中文件名已经给出; 而UploadData()方法把作为字节数组提供的二进制数据上传至指定的URI(还有一个DownloadData() 方法,用于从URI 中检索字节数组):

WebRequest类和WebResponse类

WebRequest 类代表要给某个特定URI 发送信息的请求,URI 作为参数传递给Create()方法。 WebResponse 类代表从服务器检索的数据。调用WebRequest.GetResponse()方法,实际上是把请求发 送给Web 服务器,并创建一个WebResponse 对象,以检查返回的数据。与WebClient 对象一样,可以 得到一个代表数据的数据流,但是,这里的数据流使用WebResponse.GetResponseStream()方法获得。

首先讨论怎样使用这些类下载Web 页面——这个示例与前面的示例一样,但使用WebRequest 和WebResponse 类。在此过程中,将解释涉及的类的层次结构,然后阐述怎样利用这个层次结构所 支持的其他HTTP 功能。

修改了BasicWebClient 示例,以使用WebRequest 类和WebResponse 类。

public Form1()
{
    InitializeComponent();
    WebRequest wrq = WebRequest.Create("http://www.reuters.com");
    WebResponse wrs = wrq.GetResponse();
    Stream strm = wrs.GetResponseStream();
    StreamReader sr = new StreamReader(strm);
    string line;
    while ( (line = sr.ReadLine()) != null)
    {
        listBox1.Items.Add(line);
    }
    strm.Close();
}

在这段代码中,首先对代表Web 请求的对象进行实例化。但在此没有使用构造函数,而是调用 静态的WebRequest.Create()方法,WebRequest 类是支持不同网络协议的类的层次 结构的一部分,为了给请求类型接收一个对正确对象的引用,需要一个工厂机制。WebRequest.Create() 方法会为给定的协议创建合适的对象。

HTTP 协议的一个重要方面就是能够利用请求数据流和响应数据流发送扩展的标题信息。标题 信息可以包括cookies 以及发送请求的特定浏览器(用户代理)的详细信息。果然,.NET Framework 为访问最重要的数据提供了全方位的支持。WebRequest 类和WebResponse 类提供了读取标题信息的一些支持。而两个派生的类HttpWebRequest 和HttpWebResponse 提供了其他HTTP 特定的信息。

因为 HttpWebRequest 对象实例派生自WebRequest 类,所以可以在需要WebRequest 类的任何地方使用新 实例。另外,还可以把实例的类型强制转换为HttpWebRequest 引用,并访问HTTP 协议特定的属性。 同样,在使用HTTP 时,GetResponse()方法调用会把HttpWebResponse 实例返回为WebResponse 引 用。也可以进行一个简单的强制转换,以访问HTTP 特定的功能。

在 GetResponse()方法调用之前添加如下代码,可以检查两个标题属性的某些内容:

WebRequest wrq = WebRequest.Create("http://www.reuters.com");
HttpWebRequest hwrq = (HttpWebRequest)wrq;
listBox1.Items.Add("Request Timeout (ms) = " + wrq.Timeout);
listBox1.Items.Add("Request Keep Alive = " + hwrq.KeepAlive);
listBox1.Items.Add("Request AllowAutoRedirect = " + hwrq.AllowAutoRedirect);

Timeout 属性的单位是毫秒,其默认值是100 000。可以设置这个属性,以控制WebRequest 对 象在抛出WebException 异常之前等待相应的响应时间。可以检查WebException.Status 属性,以查看 产生异常的原因。这个枚举包括超时、连接失败、协议错误等的状态码。

因为 KeepAlive 属性是对HTTP 协议的特定扩展,所以可以通过HttpWebRequest 引用访问这个 属性。KeepAlive 属性允许多个请求使用同一个连接,在后续的请求中节省关闭和重新打开连接的 时间。其默认值为true。

AllowAutoRedirec 属性也专用于HttpWebRequest 类,使用这个属性可以控制Web 请求是否应自 动跟随Web 服务器上的重定向响应。其默认值也是true。如果只允许有限次数的重定向,就可以把 HttpWebRequest 类的MaximumAutomaticRedirections 属性设置为期望的数值。

请求类和响应类以属性的形式提供大多数重要的标题,也可以使用Headers 属性本身显示标题 的整个集合。在GetResponse()方法调用的后面添加如下代码,可以把所有标题放在列表框控件中:

WebRequest wrq = WebRequest.Create("http://www.reuters.com");
WebResponse wrs = wrq.GetResponse();
WebHeaderCollection whc = wrs.Headers;

for(int i = 0; i < whc.Count; i++)
{
listBox1.Items.Add(string.Format("Header {0}: {1}",
whc.GetKey(i), whc[i]));
}

身份验证

WebRequest 类中的另一个属性是Credentials 属性。如果需要把身份验证证书附带在请求中,就 可以用用户名和密码创建NetworkCredential 类(也在System.Net 名称空间中)的一个实例。在调用 GetResponse()方法之前,添加下述代码:

NetworkCredential myCred = new NetworkCredential("myusername", "mypassword");
wrq.Credentials = myCred;

使用代理

许多公司都需要使用代理服务器进行所有类型的HTTP 或FTP 请求。代理服务器常常使用某种 形式的安全性(通常是用户名和密码),路由公司的所有请求和响应。对于使用WebClient 对象或 WebRequest 对象的应用程序,需要考虑这些代理服务器。与前面的NetworkCredential 对象一样,在 进行调用以执行实际请求之前,需要使用WebProxy 对象。

WebProxy wp = new WebProxy("192.168.1.100", true);
wp.Credentials = new NetworkCredential("user1", "user1Password");
WebRequest wrq = WebRequest.Create("http://www.reuters.com");
wrq.Proxy = wp;
WebResponse wrs = wrq.GetResponse();

如果除了证书之外,还需要设计用户的域,就应在NetworkCredential 实例上使用另一个签名:

WebProxy wp = new WebProxy("192.168.1.100", true);
wp.Credentials = new NetworkCredential("user1", "user1Password", "myDomain");
WebRequest wrq = WebRequest.Create("http://www.reuters.com");
wrq.Proxy = wp;
WebResponse wrs = wrq.GetResponse();

异步页面请求

WebRequest 类的另一个特性就是可以异步地请求页面。这个特性很重要,因为在给主机发送请 求到接收响应之间有很长的延迟。WebClient.DownloadData()和WebRequest.GetResponse()等方法在 响应没有从服务器回来之前,是不会返回的。如果不希望在那段时间中应用程序处于等待状态,则 最好使用BeginGetResponse()方法和EndGetResponse()方法,BeginGetResponse()方法可以异步地工 作,并立即返回。在底层,运行库会异步地管理一个后台线程,以从服务器上接收响应。 BeginGetResponse()方法不返回WebResponse 对象,而是返回一个实现IAsyncResult 接口的对象。使 用这个接口可以选择或等待可用的响应,然后调用EndGetResponse()方法搜集结果。

也可以把一个回调委托传递给BeginGetResponse()方法。该回调委托的目的地是一个返回类型 为void 并把IAsyncResult 引用作为参数的方法,当工作线程搜集完响应后,运行库就调用该回调委 托,以通知用户工作已完成。如下面的代码所示,在回调方法中调用EndGetResponse()方法可以检 索WebResponse 对象:

public Form1()
{
InitializeComponent();
WebRequest wrq = WebRequest.Create("http://www.reuters.com");
wrq.BeginGetResponse(new AsyncCallback(OnResponse), wrq);
}
protected static void OnResponse(IAsyncResult ar)
{
WebRequest wrq = (WebRequest)ar.AsyncState;
WebResponse wrs = wrq.EndGetResponse(ar);
// read the response...
}

注意可以作为BeginGetResponse()的第二个参数传递WebRequest 对象,检索最初的WebRequest 对象。第二个参数是一个对象引用,称为状态参数。在回调方法的过程中,可以使用IAsyncResult 接口的AsyncState 属性检索相同的状态对象。


阅读原文:原文链接


该文章在 2025/3/31 11:14:51 编辑过
关键字查询
相关文章
正在查询...
点晴ERP是一款针对中小制造业的专业生产管理软件系统,系统成熟度和易用性得到了国内大量中小企业的青睐。
点晴PMS码头管理系统主要针对港口码头集装箱与散货日常运作、调度、堆场、车队、财务费用、相关报表等业务管理,结合码头的业务特点,围绕调度、堆场作业而开发的。集技术的先进性、管理的有效性于一体,是物流码头及其他港口类企业的高效ERP管理信息系统。
点晴WMS仓储管理系统提供了货物产品管理,销售管理,采购管理,仓储管理,仓库管理,保质期管理,货位管理,库位管理,生产管理,WMS管理系统,标签打印,条形码,二维码管理,批号管理软件。
点晴免费OA是一款软件和通用服务都免费,不限功能、不限时间、不限用户的免费OA协同办公管理系统。
Copyright 2010-2025 ClickSun All Rights Reserved