91网首页-91网页版-91网在线观看-91网站免费观看-91网站永久视频-91网站在线播放

LOGO OA教程 ERP教程 模切知識(shí)交流 PMS教程 CRM教程 開(kāi)發(fā)文檔 其他文檔  
 
網(wǎng)站管理員

C# 網(wǎng) 絡(luò)(WebClient類(lèi))

admin
2025年3月29日 21:22 本文熱度 312

?

本章內(nèi)容  :
● 從Web 下載文件
● 在Windows 窗體應(yīng)用程序中使用WebBrowser 控件
● 操縱 IP 地址,執(zhí)行DNS 查詢(xún)
● 用 TCP、UDP 和套接字類(lèi)進(jìn)行套接字編程

WebClient類(lèi)

如果只想從特定的URI(Uniform Resource Identifier,統(tǒng)一資源標(biāo)識(shí)符)請(qǐng)求文件,則可以使用的最簡(jiǎn)單的.NET 類(lèi)是System.Net.WebClient。這個(gè)類(lèi)是非常高層的類(lèi),它只用一兩條命令執(zhí)行基本操 作。.NET Framework 目前支持以http:、https:和file:標(biāo)識(shí)符開(kāi)頭的URI。

術(shù)語(yǔ) URL(統(tǒng)一資源定位符)在新的技術(shù)規(guī)范中已不再使用,現(xiàn)在更常使用的是 URI(統(tǒng)一資源標(biāo)識(shí)符)。URI 的含義大致與URL 相同,但URI 更通用,因?yàn)樗灰馕?著用戶正在使用其中一個(gè)熟悉的協(xié)議,如HTTP 或FTP。

下載文件

使用 WebClient 類(lèi)下載文件有兩種方法,具體使用哪一種方法取決于文件內(nèi)容的處理方式。如 果只想把文件保存到磁盤(pán)上,就應(yīng)該使用DownloadFile()方法。這個(gè)方法有兩個(gè)參數(shù):即文件的URI 和保存所請(qǐng)求的數(shù)據(jù)的位置(路徑和文件名):

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

更為常見(jiàn)的是,應(yīng)用程序需要處理從Web 站點(diǎn)檢索到的數(shù)據(jù)。為此,要使用OpenRead()方法, 這個(gè)方法返回一個(gè)Stream 引用。然后,就可以把數(shù)據(jù)從數(shù)據(jù)流中提取到內(nèi)存中:

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

基本的WebClient示例

第一個(gè)示例將闡述怎樣使用WebClient.OpenRead()方法。這個(gè)示例將把下載的頁(yè)面顯示在 ListBox 控件中。首先,作為標(biāo)準(zhǔn)的C# Windows 窗體應(yīng)用程序新建項(xiàng)目,添加一個(gè)名為listBox1 的 列表框,將其docking 屬性設(shè)置為DockStyle.Fill。在文件的開(kāi)頭,需要在using 指令列表中添加 System.Net 和System.IO 名稱(chēng)空間引用,然后對(duì)主窗體的構(gòu)造函數(shù)進(jìn)行以下改動(dòng):

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();
}

在這個(gè)示例中,把System.IO 名稱(chēng)空間中的StreamReader 類(lèi)與網(wǎng)絡(luò)數(shù)據(jù)流關(guān)聯(lián)起來(lái)。這樣,就 可以使用高層方法,例如ReadLine()方法,從數(shù)據(jù)流中以文本的形式獲取數(shù)據(jù)。據(jù)移動(dòng)抽象化為數(shù)據(jù)流概念的優(yōu)點(diǎn),這個(gè)示例就充分體現(xiàn)出了這一點(diǎn)。

WebClient 類(lèi)還有一個(gè)OpenWrite()方法,它可以返回一個(gè)可寫(xiě)的數(shù)據(jù)流,便于用戶把數(shù)據(jù)發(fā)送 給URI。也可以指定用于把數(shù)據(jù)發(fā)送給主機(jī)的方法;默認(rèn)的方法是POST。下面的代碼段假定在本 地計(jì)算機(jī)上有一個(gè)可寫(xiě)的目錄accept,這段代碼在該目錄下創(chuàng)建newfile.txt 文件,其內(nèi)容為“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 類(lèi)還提供了UploadFile()和UploadData()方法。在需要投遞HTML 窗體或上傳整個(gè)文 件時(shí),就可以使用這兩個(gè)方法。UploadFile()方法把文件上傳到指定的位置,其中文件名已經(jīng)給出; 而UploadData()方法把作為字節(jié)數(shù)組提供的二進(jìn)制數(shù)據(jù)上傳至指定的URI(還有一個(gè)DownloadData() 方法,用于從URI 中檢索字節(jié)數(shù)組):

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 類(lèi)還提供了UploadFile()和UploadData()方法。在需要投遞HTML 窗體或上傳整個(gè)文 件時(shí),就可以使用這兩個(gè)方法。UploadFile()方法把文件上傳到指定的位置,其中文件名已經(jīng)給出; 而UploadData()方法把作為字節(jié)數(shù)組提供的二進(jìn)制數(shù)據(jù)上傳至指定的URI(還有一個(gè)DownloadData() 方法,用于從URI 中檢索字節(jié)數(shù)組):

WebRequest類(lèi)和WebResponse類(lèi)

WebRequest 類(lèi)代表要給某個(gè)特定URI 發(fā)送信息的請(qǐng)求,URI 作為參數(shù)傳遞給Create()方法。 WebResponse 類(lèi)代表從服務(wù)器檢索的數(shù)據(jù)。調(diào)用WebRequest.GetResponse()方法,實(shí)際上是把請(qǐng)求發(fā) 送給Web 服務(wù)器,并創(chuàng)建一個(gè)WebResponse 對(duì)象,以檢查返回的數(shù)據(jù)。與WebClient 對(duì)象一樣,可以 得到一個(gè)代表數(shù)據(jù)的數(shù)據(jù)流,但是,這里的數(shù)據(jù)流使用WebResponse.GetResponseStream()方法獲得。

首先討論怎樣使用這些類(lèi)下載Web 頁(yè)面——這個(gè)示例與前面的示例一樣,但使用WebRequest 和WebResponse 類(lèi)。在此過(guò)程中,將解釋涉及的類(lèi)的層次結(jié)構(gòu),然后闡述怎樣利用這個(gè)層次結(jié)構(gòu)所 支持的其他HTTP 功能。

修改了BasicWebClient 示例,以使用WebRequest 類(lèi)和WebResponse 類(lèi)。

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();
}

在這段代碼中,首先對(duì)代表Web 請(qǐng)求的對(duì)象進(jìn)行實(shí)例化。但在此沒(méi)有使用構(gòu)造函數(shù),而是調(diào)用 靜態(tài)的WebRequest.Create()方法,WebRequest 類(lèi)是支持不同網(wǎng)絡(luò)協(xié)議的類(lèi)的層次 結(jié)構(gòu)的一部分,為了給請(qǐng)求類(lèi)型接收一個(gè)對(duì)正確對(duì)象的引用,需要一個(gè)工廠機(jī)制。WebRequest.Create() 方法會(huì)為給定的協(xié)議創(chuàng)建合適的對(duì)象。

HTTP 協(xié)議的一個(gè)重要方面就是能夠利用請(qǐng)求數(shù)據(jù)流和響應(yīng)數(shù)據(jù)流發(fā)送擴(kuò)展的標(biāo)題信息。標(biāo)題 信息可以包括cookies 以及發(fā)送請(qǐng)求的特定瀏覽器(用戶代理)的詳細(xì)信息。果然,.NET Framework 為訪問(wèn)最重要的數(shù)據(jù)提供了全方位的支持。WebRequest 類(lèi)和WebResponse 類(lèi)提供了讀取標(biāo)題信息的一些支持。而兩個(gè)派生的類(lèi)HttpWebRequest 和HttpWebResponse 提供了其他HTTP 特定的信息。

因?yàn)?HttpWebRequest 對(duì)象實(shí)例派生自WebRequest 類(lèi),所以可以在需要WebRequest 類(lèi)的任何地方使用新 實(shí)例。另外,還可以把實(shí)例的類(lèi)型強(qiáng)制轉(zhuǎn)換為HttpWebRequest 引用,并訪問(wèn)HTTP 協(xié)議特定的屬性。 同樣,在使用HTTP 時(shí),GetResponse()方法調(diào)用會(huì)把HttpWebResponse 實(shí)例返回為WebResponse 引 用。也可以進(jìn)行一個(gè)簡(jiǎn)單的強(qiáng)制轉(zhuǎn)換,以訪問(wèn)HTTP 特定的功能。

在 GetResponse()方法調(diào)用之前添加如下代碼,可以檢查兩個(gè)標(biāo)題屬性的某些內(nèi)容:

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 屬性的單位是毫秒,其默認(rèn)值是100 000。可以設(shè)置這個(gè)屬性,以控制WebRequest 對(duì) 象在拋出WebException 異常之前等待相應(yīng)的響應(yīng)時(shí)間。可以檢查WebException.Status 屬性,以查看 產(chǎn)生異常的原因。這個(gè)枚舉包括超時(shí)、連接失敗、協(xié)議錯(cuò)誤等的狀態(tài)碼。

因?yàn)?KeepAlive 屬性是對(duì)HTTP 協(xié)議的特定擴(kuò)展,所以可以通過(guò)HttpWebRequest 引用訪問(wèn)這個(gè) 屬性。KeepAlive 屬性允許多個(gè)請(qǐng)求使用同一個(gè)連接,在后續(xù)的請(qǐng)求中節(jié)省關(guān)閉和重新打開(kāi)連接的 時(shí)間。其默認(rèn)值為true。

AllowAutoRedirec 屬性也專(zhuān)用于HttpWebRequest 類(lèi),使用這個(gè)屬性可以控制Web 請(qǐng)求是否應(yīng)自 動(dòng)跟隨Web 服務(wù)器上的重定向響應(yīng)。其默認(rèn)值也是true。如果只允許有限次數(shù)的重定向,就可以把 HttpWebRequest 類(lèi)的MaximumAutomaticRedirections 屬性設(shè)置為期望的數(shù)值。

請(qǐng)求類(lèi)和響應(yīng)類(lèi)以屬性的形式提供大多數(shù)重要的標(biāo)題,也可以使用Headers 屬性本身顯示標(biāo)題 的整個(gè)集合。在GetResponse()方法調(diào)用的后面添加如下代碼,可以把所有標(biāo)題放在列表框控件中:

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]));
}

身份驗(yàn)證

WebRequest 類(lèi)中的另一個(gè)屬性是Credentials 屬性。如果需要把身份驗(yàn)證證書(shū)附帶在請(qǐng)求中,就 可以用用戶名和密碼創(chuàng)建NetworkCredential 類(lèi)(也在System.Net 名稱(chēng)空間中)的一個(gè)實(shí)例。在調(diào)用 GetResponse()方法之前,添加下述代碼:

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

使用代理

許多公司都需要使用代理服務(wù)器進(jìn)行所有類(lèi)型的HTTP 或FTP 請(qǐng)求。代理服務(wù)器常常使用某種 形式的安全性(通常是用戶名和密碼),路由公司的所有請(qǐng)求和響應(yīng)。對(duì)于使用WebClient 對(duì)象或 WebRequest 對(duì)象的應(yīng)用程序,需要考慮這些代理服務(wù)器。與前面的NetworkCredential 對(duì)象一樣,在 進(jìn)行調(diào)用以執(zhí)行實(shí)際請(qǐng)求之前,需要使用WebProxy 對(duì)象。

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();

如果除了證書(shū)之外,還需要設(shè)計(jì)用戶的域,就應(yīng)在NetworkCredential 實(shí)例上使用另一個(gè)簽名:

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();

異步頁(yè)面請(qǐng)求

WebRequest 類(lèi)的另一個(gè)特性就是可以異步地請(qǐng)求頁(yè)面。這個(gè)特性很重要,因?yàn)樵诮o主機(jī)發(fā)送請(qǐng) 求到接收響應(yīng)之間有很長(zhǎng)的延遲。WebClient.DownloadData()和WebRequest.GetResponse()等方法在 響應(yīng)沒(méi)有從服務(wù)器回來(lái)之前,是不會(huì)返回的。如果不希望在那段時(shí)間中應(yīng)用程序處于等待狀態(tài),則 最好使用BeginGetResponse()方法和EndGetResponse()方法,BeginGetResponse()方法可以異步地工 作,并立即返回。在底層,運(yùn)行庫(kù)會(huì)異步地管理一個(gè)后臺(tái)線程,以從服務(wù)器上接收響應(yīng)。 BeginGetResponse()方法不返回WebResponse 對(duì)象,而是返回一個(gè)實(shí)現(xiàn)IAsyncResult 接口的對(duì)象。使 用這個(gè)接口可以選擇或等待可用的響應(yīng),然后調(diào)用EndGetResponse()方法搜集結(jié)果。

也可以把一個(gè)回調(diào)委托傳遞給BeginGetResponse()方法。該回調(diào)委托的目的地是一個(gè)返回類(lèi)型 為void 并把IAsyncResult 引用作為參數(shù)的方法,當(dāng)工作線程搜集完響應(yīng)后,運(yùn)行庫(kù)就調(diào)用該回調(diào)委 托,以通知用戶工作已完成。如下面的代碼所示,在回調(diào)方法中調(diào)用EndGetResponse()方法可以檢 索WebResponse 對(duì)象:

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()的第二個(gè)參數(shù)傳遞WebRequest 對(duì)象,檢索最初的WebRequest 對(duì)象。第二個(gè)參數(shù)是一個(gè)對(duì)象引用,稱(chēng)為狀態(tài)參數(shù)。在回調(diào)方法的過(guò)程中,可以使用IAsyncResult 接口的AsyncState 屬性檢索相同的狀態(tài)對(duì)象。


閱讀原文:原文鏈接


該文章在 2025/3/31 11:14:51 編輯過(guò)
關(guān)鍵字查詢(xún)
相關(guān)文章
正在查詢(xún)...
點(diǎn)晴ERP是一款針對(duì)中小制造業(yè)的專(zhuān)業(yè)生產(chǎn)管理軟件系統(tǒng),系統(tǒng)成熟度和易用性得到了國(guó)內(nèi)大量中小企業(yè)的青睞。
點(diǎn)晴PMS碼頭管理系統(tǒng)主要針對(duì)港口碼頭集裝箱與散貨日常運(yùn)作、調(diào)度、堆場(chǎng)、車(chē)隊(duì)、財(cái)務(wù)費(fèi)用、相關(guān)報(bào)表等業(yè)務(wù)管理,結(jié)合碼頭的業(yè)務(wù)特點(diǎn),圍繞調(diào)度、堆場(chǎng)作業(yè)而開(kāi)發(fā)的。集技術(shù)的先進(jìn)性、管理的有效性于一體,是物流碼頭及其他港口類(lèi)企業(yè)的高效ERP管理信息系統(tǒng)。
點(diǎn)晴WMS倉(cāng)儲(chǔ)管理系統(tǒng)提供了貨物產(chǎn)品管理,銷(xiāo)售管理,采購(gòu)管理,倉(cāng)儲(chǔ)管理,倉(cāng)庫(kù)管理,保質(zhì)期管理,貨位管理,庫(kù)位管理,生產(chǎn)管理,WMS管理系統(tǒng),標(biāo)簽打印,條形碼,二維碼管理,批號(hào)管理軟件。
點(diǎn)晴免費(fèi)OA是一款軟件和通用服務(wù)都免費(fèi),不限功能、不限時(shí)間、不限用戶的免費(fèi)OA協(xié)同辦公管理系統(tǒng)。
Copyright 2010-2025 ClickSun All Rights Reserved

主站蜘蛛池模板: 精品国产免费 | 国产欧美一区二区三 | 97日日| 精品欧乱仑在线 | 国产亚洲制服 | 精品国产欧美精品v | 国产精品三级在 | 人人揉人人捏人人添 | 午夜福利导航免费 | 中文字幕在线免费看 | 欧美性爱在 | 日韩欧美午夜福利 | 国产精品福利 | 午夜三级在线观看 | 福利二区在线观看 | 日本成年人黄a大片 | 91人人澡人人 | 国产精品亚洲一区 | 日韩精品视频美在 | 国产日韩在线视 | 国产老熟女精品一区 | 91麻精品 | 国产福利电影网 | 欧美在线专区 | 日本大片视频 | 国产综合8 | 亚洲无码中文字幕在线观看 | 日韩视频在线 | 国产精品精品国产 | 国产毛a| 日本免码va在 | 国产精品电影在线 | 69精品二三区 | 国内精自视频品线 | 国产乱子伦精品视频 | 91最新在线观看 | 国产精品男人的天堂 | 国产精品盗摄视频 | 国产国产乱老熟女视 | 精品一区二区三区中 | 午夜福利在线影院 |