『壹』 如何用httpRequest,WebRequest等類獲取網頁文件信息並且下載文件呢
首先 得購買空間:服務商會給你一個FTP地址和用戶名 密碼
其次:找一個FTP軟體 flashfxp 輸入服內務商提供的FTP地址容 用戶名 密碼登陸 上傳
或直接打開瀏覽器 輸入FTP地址 輸入用戶名 密碼 把做好的網頁 復制 粘貼上去主OK了
『貳』 使用HttpWebRequest下載Zip文件並解壓到相應文件夾
string persistentDataPath_ = Application.persistentDataPath;
string resourcePath_ = Path.Combine(persistentDataPath_, "151515");
//設置存儲位置
string zipPath_ = (resourcePath_ + ".zip").Replace(@"\", "/");
if (Directory.Exists(resourcePath_))
Directory.Delete(resourcePath_, true);
if (File.Exists(zipPath_))
File.Delete(zipPath_);
String filePath = @"您的url地址";//本地路徑不行,必須是http或者https或者www才可以
//寫入流
FileStream stream = File.Open(zipPath_, FileMode.OpenOrCreate);
//創建httpwebrequest請求
HttpWebRequest downloadRequest = (HttpWebRequest)WebRequest.Create(filePath);
downloadRequest.Method = "GET";
using (HttpTools downloader_ = new HttpTools(downloadRequest, null, stream))
{
yield return downloader_;
bool updateResult = false;
//清空數據流關閉
stream.Flush();
stream.Close();
bool decompressFinish_ = false;
if (downloader_.Exception == null)
{
// 解壓資源包
AsyncExtra(zipPath_, persistentDataPath_, delegate(bool b)
{
updateResult = b;
decompressFinish_ = true;
});
// 等待壓縮完成
while (!decompressFinish_) yield return null;
}
else
{
//ReportManager.Inst.ReportException(this.downloader_.Exception);
decompressFinish_ = true;
}
if (updateResult)
{
LoadPrint("更新完成");
}
else
{
LoadPrint("更新失敗");
}
}
//第二部分
/// <summary>
/// 將指定的zip文件解壓縮到指定目錄
/// </summary>
/// <param name="path_"></param>
/// <param name="targetDir"></param>
void AsyncExtra(string path_, string targetDir, Action<bool> cb)
{
Thread t = new Thread(delegate()
{
try
{
if (!Directory.Exists(targetDir) && !string.IsNullOrEmpty(targetDir))
Directory.CreateDirectory(targetDir);
using (ZipInputStream zipStream = new ZipInputStream(File.OpenRead(path_)))
{
//this.state_ = ResourceUpdateState.Decompression;
ZipEntry entry;
while ((entry = zipStream.GetNextEntry()) != null)
ExtraZipEntry(zipStream, entry, targetDir);
}
cb(true);
}
catch (Exception e)
{
//ReportManager.Inst.ReportException(e);
cb(false);
}
});
t.Start();
}
//第三部分
void ExtraZipEntry(ZipInputStream zipStream, ZipEntry entry, string outputDir)
{
int bufferSize_ = 8192;
byte[] buffer = new byte[bufferSize_];
int readSize_ = 0;
string directroyName = Path.GetDirectoryName(entry.Name);
string fileName = Path.GetFileName(entry.Name);
string absDirectory = Path.Combine(outputDir, directroyName);
string absFile = Path.Combine(absDirectory, fileName);
Debug.Log("解壓信息:" + directroyName + " " + fileName + " " + absDirectory + " " + absFile);
if (!string.IsNullOrEmpty(directroyName))
Directory.CreateDirectory(absDirectory);
int size = (int)entry.Size;
using (FileStream fileStream = File.Create(absFile))
{
while (readSize_ < size)
{
int rd = zipStream.Read(buffer, 0, Math.Min(size - readSize_, bufferSize_));
fileStream.Write(buffer, 0, rd);
readSize_ += rd;
}
}
}
『叄』 HttpRequest 和HttpWebRequest的區別
System.Web.HttpRequest是封裝瀏覽器對伺服器的請求的,主要用在ASP.NET中,其中包括瀏覽器請求的網址,查詢字元串數據或表單數據等等
而System.Net.HttpWebRequest則是用來簡化網路請求的過程,從伺服器上獲取文件/結果的,譬如你可以在代碼中用這個類冒充瀏覽器(設置一個UserAgent)來發請求,處理回應
第一:他們不是父子關系。
第二:Syste.Net.HttpWebRequest 類是System.Net.WebRequest抽象類的一個子類,它是
.NET Framework 的用於訪問 Internet
數據的請求/響應模型的抽象基類。使用該請求/響應模型的應用程序可以用協議不可知的方式從 Internet
請求數據。在這種方式下,應用程序處理 WebRequest 類的實例,而協議特定的子類則執行請求的具體細節。
System.Net.HttpWebRequest 類和System.Net.FileWebRequest都繼承了WebRequest
1、FileWebRequest 類為使用 file:// 方案來請求本地文件的 URI 實現 WebRequest 抽象基類。
2、HttpWebRequest 類對 WebRequest 中定義的屬性和方法提供支持,也對使用戶能夠直接與使用 HTTP 的伺服器交互的附加屬性和方法提供支持。
第三:System.Web.HttpRequest 類使 ASP.NET 能夠讀取客戶端在 Web
請求期間發送的 HTTP 值。HttpRequest 類的方法和屬性通過
HttpApplication、HttpContext、Page 和 UserControl 類的 Request
屬性公開。
所以使用System.Web.HttpRequest類的時候其實都是利用HttpApplication、HttpContext、Page
和 UserControl 類的 Request
屬性。而使用System.Net.HttpWebRequest類時是為了獲得一個Uri資源。自己創建。
System.Web 命名空間提供使得可以進行瀏覽器與伺服器通信的類和介面。此命名空間包括 HttpRequest 類(用於提供有關當前
HTTP 請求的廣泛信息)、HttpResponse 類(用於管理對客戶端的 HTTP 輸出)以及 HttpServerUtility
類(用於提供對伺服器端實用工具與進程的訪問)。System.Web 還包括用於 Cookie 操作、文件傳輸、異常信息和輸出緩存控制的類。
System.Net 命名空間為當前網路上使用的多種協議提供了簡單的編程介面。WebRequest 和 WebResponse
類形成了所謂的可插接式協議的基礎,可插接式協議是網路服務的一種實現,它使您能夠開發出使用 Internet
資源的應用程序,而不必考慮各種不同協議的具體細節。
『肆』 誰知道C#使用HttpWebRequest的POST方法發送大量數據的方法
不想一點一點寫了,粘貼給你吧
使用 HttpWebRequest 向網站提交數據
HttpWebRequest 是 .net 基類庫中的一個類,在命名空間 System.Net 下面,用來使用戶通過 HTTP 協議和伺服器交互。
HttpWebRequest 對 HTTP 協議進行了完整的封裝,對 HTTP 協議中的 Header, Content, Cookie 都做了屬性和方法的支持,很容易就能編寫出一個模擬瀏覽器自動登錄的程序。
程序使用 HTTP 協議和伺服器交互主要是進行數據的提交,通常數據的提交是通過 GET 和 POST 兩種方式來完成,下面對這兩種方式進行一下說明:
1. GET 方式。 GET 方式通過在網路地址附加參數來完成數據的提交,比如在地址 中,前面部分 表示數據提交的網址,後面部分 hl=zh-CN 表示附加的參數,其中 hl 表示一個鍵(key), zh-CN 表示這個鍵對應的值(value)。程序代碼如下:
HttpWebRequest req = (HttpWebRequest) HttpWebRequest.Create( "" );
req.Method = "GET";
using (WebResponse wr = req.GetResponse())
{
//在這里對接收到的頁面內容進行處理
}
2. POST 方式。 POST 方式通過在頁面內容中填寫參數的方法來完成數據的提交,參數的格式和 GET 方式一樣,是類似於 hl=zh-CN&newwindow=1 這樣的結構。程序代碼如下:
string param = "hl=zh-CN&newwindow=1";
byte[] bs = Encoding.ASCII.GetBytes(param);
HttpWebRequest req = (HttpWebRequest) HttpWebRequest.Create( "" );
req.Method = "POST";
req.ContentType = "application/x-www-form-urlencoded";
req.ContentLength = bs.Length;
using (Stream reqStream = req.GetRequestStream())
{
reqStream.Write(bs, 0, bs.Length);
}
using (WebResponse wr = req.GetResponse())
{
//在這里對接收到的頁面內容進行處理
}
在上面的代碼中,我們訪問了 的網址,分別以 GET 和 POST 方式提交了數據,並接收了返回的頁面內容。然而,如果提交的參數中含有中文,那麼這樣的處理是不夠的,需要對其進行編碼,讓對方網站能夠識別。
3. 使用 GET 方式提交中文數據。 GET 方式通過在網路地址中附加參數來完成數據提交,對於中文的編碼,常用的有 gb2312 和 utf8 兩種,用 gb2312 方式編碼訪問的程序代碼如下:
Encoding myEncoding = Encoding.GetEncoding("gb2312");
string address = "" + HttpUtility.UrlEncode("參數一", myEncoding) + "=" + HttpUtility.UrlEncode("值一", myEncoding);
HttpWebRequest req = (HttpWebRequest)HttpWebRequest.Create(address);
req.Method = "GET";
using (WebResponse wr = req.GetResponse())
{
//在這里對接收到的頁面內容進行處理
}
在上面的程序代碼中,我們以 GET 方式訪問了網址 ,傳遞了參數「參數一=值一」,由於無法告知對方提交數據的編碼類型,所以編碼方式要以對方的網站為標准。常見的網站中, (網路)的編碼方式是 gb2312, (谷歌)的編碼方式是 utf8。
4. 使用 POST 方式提交中文數據。 POST 方式通過在頁面內容中填寫參數的方法來完成數據的提交,由於提交的參數中可以說明使用的編碼方式,所以理論上能獲得更大的兼容性。用 gb2312 方式編碼訪問的程序代碼如下:
Encoding myEncoding = Encoding.GetEncoding("gb2312");
string param = HttpUtility.UrlEncode("參數一", myEncoding) + "=" + HttpUtility.UrlEncode("值一", myEncoding) + "&" + HttpUtility.UrlEncode("參數二", myEncoding) + "=" + HttpUtility.UrlEncode("值二", myEncoding);
byte[] postBytes = Encoding.ASCII.GetBytes(param);
HttpWebRequest req = (HttpWebRequest) HttpWebRequest.Create( "" );
req.Method = "POST";
req.ContentType = "application/x-www-form-urlencoded;charset=gb2312";
req.ContentLength = postBytes.Length;
using (Stream reqStream = req.GetRequestStream())
{
reqStream.Write(bs, 0, bs.Length);
}
using (WebResponse wr = req.GetResponse())
{
//在這里對接收到的頁面內容進行處理
}
從上面的代碼可以看出, POST 中文數據的時候,先使用 UrlEncode 方法將中文字元轉換為編碼後的 ASCII 碼,然後提交到伺服器,提交的時候可以說明編碼的方式,用來使對方伺服器能夠正確的解析。
以上列出了客戶端程序使用 HTTP 協議與伺服器交互的情況,常用的是 GET 和 POST 方式。現在流行的 WebService 也是通過 HTTP 協議來交互的,使用的是 POST 方法。與以上稍有所不同的是, WebService 提交的數據內容和接收到的數據內容都是使用了 XML 方式編碼。所以, HttpWebRequest 也可以使用在調用 WebService 的情況下。
『伍』 C# HttpWebRequest上傳大文件(200M)提示遠程主機強迫關閉了一個現有的連接
好明顯就是超時導致,把寫超時時間設置長一點
『陸』 httpWebRequest.GetResponse() 基礎連接已關閉 發送時發生錯誤
這個不是超時問題,在XP下只要超過125M以上一提交接就報錯,WIN7下只要伺服器支持超時時間范圍內,就算1G的文件傳一天也不會超時,因為.NET框架底層的WebRequest是用IE的wininet.dll來進行網路請求的,所以跟不同系統環境下的IE內核有關,要解決此問題只有一個辦法,就是自己用SOCKET來進行HTTP請求
『柒』 我用C#開發一個下載功能,用HttpWebRequest類來訪問下載,但是發現最大的下載速度是128kbs
下載速度不僅僅是由你的帶寬決定的,估計你是兩台電腦間測試,目前國內的寬頻多數是上下行不對等的,一般電信20M以下的寬頻的上行速度不超過70KB/s,而20M的大概就是你說的128KB/s
,一般對稱寬頻是專線
『捌』 HttpWebRequest怎麼長連接
HTTP是無狀態的
也就是說,瀏覽器和伺服器每進行一次HTTP操作,就建立一次連接,但任務結束就中斷連接。如果客戶端瀏覽器訪問的某個HTML或其他類型的 Web頁中包含有其他的Web資源,如JavaScript文件、圖像文件、CSS文件等;當瀏覽器每遇到這樣一個Web資源,就會建立一個HTTP會話
HTTP1.1和HTTP1.0相比較而言,最大的區別就是增加了持久連接支持(貌似最新的 http1.0 可以顯示的指定 keep-alive),但還是無狀態的,或者說是不可以信任的。
如果瀏覽器或者伺服器在其頭信息加入了這行代碼
Connection:keep-alive
TCP連接在發送後將仍然保持打開狀態,於是,瀏覽器可以繼續通過相同的連接發送請求。保持連接節省了為每個請求建立新連接所需的時間,還節約了帶寬。
實現長連接要客戶端和服務端都支持長連接。
所謂長連接指建立SOCKET連接後不管是否使用都保持連接,但安全性較差,
所謂短連接指建立SOCKET連接後發送後接收完數據後馬上斷開連接,一般銀行都使用短連接
短連接:比如
http
的,只是連接、請求、關閉,過程時間較短
,
伺服器若是一段時間內沒有收到請求即可關
閉連接。
長連接:有些服務需要長時間連接到伺服器,比如
CMPP
,一般需要自己做在線維持。
最近在看
「
伺服器推送技術
」
,在
B/S
結構中,通過某種
magic
使得客戶端不需要通過輪詢即可以得到服務
端的最新信息(比如股票價格)
,這樣可
以節省大量的帶寬。
傳統的輪詢技術對伺服器的壓力很大,
並且造成帶寬的極大浪費。如果改用
ajax
輪詢,可以降低帶寬的負荷
(因為伺服器返回的不是完整頁面)
,
但是對伺服器
的壓力並不會有明顯的減少。
而推技術(
push
)可以改善這種情況。但因為
HTTP
連接
的特性(短暫,必須由客戶端發起)
,使得推技術的實現比較困難,常見的做法是通過延長
http
連接的壽
命
,
來實現
push
。
接下來自然該討論如何延長
http
連接的壽命
,
最簡單的自然是死循環法
:
【
servlet
代
碼
片
段
】
public
void
doGet(Request
req,
Response
res)
{
PrintWriter
out
=
res.getWriter();
……
正
常
輸
出
頁
面
……
『玖』 為什麼HttpWebRequest多線程並發訪問總是會被阻塞
應用伺服器的性能分析是復雜的,關注點很多。比如典型場景Web伺服器+資料庫,底層網路鏈路和網路硬體性能姑且不論,單看:Web伺服器對靜態文件的讀寫與磁碟和文件系統IO性能緊密相關;對數據的處理和資料庫性能相關;而高並發訪問則關繫到操作系統的線程、網路套接字以及非同步網路模型的效率。
在數據量大的情況下,資料庫的性能成為一個至關重要的因素,隨之帶來Web伺服器等待資料庫的時間。在此基礎上如果有大量的用戶同時訪問,那麼會對Web伺服器帶來什麼樣的影響?以下主要討論這個問題。
對於並發訪問的處理,一般有兩種處理機制:非同步非阻塞機制、多線程阻塞機制(介紹略)。在測試選擇上,前者使用基於Python的Tornado伺服器,而後者使用基於Java的Tomcat伺服器。注意:本文並非討論開發語言的優劣,事實上,新版本的Java也支持非同步機制,甚至高性能的epoll等。
測試工具:變態級的http_load
測試方法:使用該工具模擬1、10、100、1000個客戶端並發訪問以下場景,每次測試時間1分鍾,得到伺服器端每秒的總響應數。注意:由於Tomcat最大線程的限制(下面有提到)以及操作系統對埠數量的限制,1000個並發已經能夠得到明顯的結論了。
測試場景:
靜態文件的讀寫。一個html文件和一大一小兩個圖片,大小分別為676k、1.6M和12k,使用http_load工具隨機讀取。靜態文件讀寫的耗時可以忽略不計的。
模擬一個耗時操作,比如資料庫操作。注意:耗時操作並不佔用Web伺服器本身的資源,它更多地體現的是Web伺服器對並發訪問處理的「合理」性。
『拾』 怎麼樣使用HttpWebRequest和正則表達式提取網頁中的鏈接
用HttpWebRequest和正則表達式提取網頁中的鏈接
用HttpWebRequest取得網頁源代碼
Dim url As String=" http://www.sina.com "
Dim httpReq As System.Net.HttpWebRequest
Dim httpResp As System.Net.HttpWebResponse
Dim httpURL As New System.Uri(url)
httpReq = CType(WebRequest.Create(httpURL), HttpWebRequest)
httpReq.Method = "GET"
httpResp = CType(httpReq.GetResponse(), HttpWebResponse)
httpReq.KeepAlive = False \' 獲取或設置一個值,該值指示是否與 Internet 資源建立持久連接。
Dim reader As StreamReader = _
New StreamReader(httpResp.GetResponseStream, System.Text.Encoding.GetEncoding("GB2312"))
Dim respHTML As String = reader.ReadToEnd() \'respHTML就是網頁源代碼
用正則表達式取得鏈接地址
Dim strRegex As String = "//([\\w-]+\\.)+[\\w-]+(/[\\w- ./?%&=]*)?" \'這就是表達式
Dim r As System.Text.RegularExpressions.Regex
Dim m As System.Text.RegularExpressions.MatchCollection
r = New System.Text.RegularExpressions.Regex(strRegex, System.Text.RegularExpressions.RegexOptions.IgnoreCase)
m = r.Matches(respHTML)
Dim i As Integer
For i = 0 To m.Count - 1
form1.DefInstance.ListBox1.Items.Add(m(i).Value) \'form1.DefInstance是form1的共享屬性和實例
Next i
form1.DefInstance.ListBox.Visible = True \' 設置ListBox為可見
form1.DefInstance.ListBox.Sorted = True \' 對ListBox各元素進行排序
form1.DefInstance.ListBox1.Items.Add(m(i).Value) \'form1.DefInstance是form1的共享屬性和實例, 共享成員如果是方法或屬性,我們不用創建實例就可以直接用『類名 .共享成員\'的方法進行調用。設置方法如下:
Private Shared m_vb6FormDefInstance As form1
Public Shared Property DefInstance() As form1
Get
If m_vb6FormDefInstance Is Nothing OrElse m_vb6FormDefInstance.IsDisposed Then \'判斷窗體實例是否存在
m_vb6FormDefInstance = New form1
End If
DefInstance = m_vb6FormDefInstance
End Get
Set(ByVal Value As form1)
m_vb6FormDefInstance = Value
End Set
End Property
去除重復地址
Dim countForms As Integer \'以下代碼去除重復地址
Dim lstForms() As String
Dim CurId As Integer
With formBrow.DefInstance.ListBox1
ReDim Preserve lstForms(0)
lstForms(0) = .Items(0) \'新數組的第一項和list的第一項相同
For countForms = 1 To .Items.Count - 1 \'items.count得到list1中的項目數
CurId = UBound(lstForms) \'curid為newlist中有項目數
If .Items(countForms) <> lstForms(CurId) Then \'如果舊表第二項不等於新表最大項
ReDim Preserve lstForms(CurId + 1) \'定位到新表第二項
lstForms(CurId + 1) = .Items(countForms) \'新表第二項等於舊表第二項
End If
Next countForms
.Items.Clear() \'刪除舊表所有項
For countForms = 0 To UBound(lstForms) \'把新表寫入舊表
.Items.Add(lstForms(countForms))
Next countForms
End With
把地址導出為XML
可擴展標記語言 (XML) 是一種提供數據描述格式的標記語言。該語言使跨越多個平台進行更准確的內容聲明和獲得更有意義的搜索結果變得更加容易。此外,XML 實現了表示與數據的分離。例如,在 HTML 中,使用標記來告訴瀏覽器將數據顯示為粗體或斜體;而在 XML 中,標記只用於描述數據,例如城市名、溫度和大氣壓。在 XML 中,使用樣式表(例如,可擴展樣式表語言 (XSL) 和層疊樣式表 (CSS))在瀏覽器中顯示數據。XML 使數據與表示及處理分離開來,通過應用不同的樣式表和應用程序,使您能夠根據需要顯示和處理數據。
XmlTextWriter 是 XmlWriter 類的實現,該類提供將 XML 寫入文件、流或 TextWriter 的 API。該類有許多驗證和檢查規則,以確保所編寫的 XML 的格式正確。當與某些規則發生沖突時,將會引發異常,並且這些異常應該被捕獲。XmlTextWriter 有不同的構造函數,每個函數指定寫入 XML 數據的不同類型的位置。下面代碼使用的是將 XML 寫入文件的構造函數。
首先使用 Formatting 屬性指定正被編寫的 XML 數據的格式。通過將此屬性設置為 Indented,編寫器使用 Indentation 和 IndentChar 屬性縮進子元素。
代碼顯示了與每個 XML 節點類型相對應的 XML 編寫方法。例如,編寫一個元素將調用 WriteElementString 方法,編寫一個屬性將調用 WriteAttributeString 方法。對於嵌套級別,可以使用 WriteStartElement/WriteEndElement 對;如果要創建較復雜的屬性,則可以使用 WriteStartAttribute/WriteEndAttribute 對。
請注意代碼如何使用 WriteStartDocument 方法編寫帶版本號「1.0」的 XML 聲明。如果要讓編寫器檢查該文檔的格式是否正確(先是 XML 聲明,序言中的 DOCTYPE,只有一個根級別元素,等等),您必須在調用任何其他編寫方法之前,調用此可選的 WriteStartDocument 方法。接著,此代碼調用 WriteDocType 方法編寫名為「urls」的文檔類型。WriteDocType 調用中的第三個參數指定編寫器將編寫 SYSTEM「urls.dtd」。編寫完成後,XML 文件指示有一個要根據其進行驗證的外部 DTD。
最後,代碼調用 Flush 方法將 XML 數據保存到文件,然後才調用 Close 方法。(雖然此示例確實只需要 Close 方法,但是也存在這樣的情況,即需要保存所生成的 XML,並且需要重復使用編寫器。)
要檢查 XmlTextWriter 的輸出,可通過用 XmlTextReader 讀取生成的文件來執行往返測試,以驗證 XML 的格式是正確的。
Private Sub saveXml()
Dim saveFileDialog1 As New SaveFileDialog
saveFileDialog1.Filter = "xml|*.xml"
saveFileDialog1.Title = "Save a xml File"
saveFileDialog1.ShowDialog()
If saveFileDialog1.FileName <> "" Then\'如果文件名不等於空白
Dim fileName As String = saveFileDialog1.FileName
If Not System.IO.File.Exists(fileName) Then \'如果不存在同名文件
Dim myXmlTextWriter As XmlTextWriter = New XmlTextWriter(fileName, Nothing)
myXmlTextWriter.Formatting = System.Xml.Formatting.Indented\'設置縮進
myXmlTextWriter.WriteStartDocument(False)
myXmlTextWriter.WriteDocType("urls", Nothing, "urls.dtd", Nothing)
myXmlTextWriter.WriteComment("This file save the Urls")\'注釋
myXmlTextWriter.WriteStartElement("urls")\'開始元素
myXmlTextWriter.WriteStartElement("url1", Nothing)\'開始元素
myXmlTextWriter.WriteAttributeString("now", Now)\'在屬性里記錄時間
For countAll As Integer = 0 To ListBox1.Items.Count - 1
Dim title As String = Strings.Right(ListBox1.Items.Item(countAll), 3)\'取URL後三字
Dim body As String = lstMuLu.Items.Item(countAll)
myXmlTextWriter.WriteElementString(title, Nothing, body)
Next
myXmlTextWriter.WriteEndElement()
myXmlTextWriter.WriteEndElement()
\'Write the XML to file and close the myXmlTextWriter
myXmlTextWriter.Flush()
myXmlTextWriter.Close()
End If
End If
End Sub