.NET Framework 中 System.Net 命名空間下提供了 HttpWebRequest 和 HttpWebResponse 2個類,他們是用於發送和接收HTTP數據的最好選擇。它們支持一系列有用的屬性。默認情況下這2個類對於控制台程序、WinForm、ASP.NET來說都是可訪問的。HttpWebRequest 對象不是利用 new 關鍵字通過構造函數來創建的,而是利用工廠機制(factory mechanism),通過抽象類WebRequest.Create()方法來創建的。
HttpWebRequest webRequest = WebRequest.Create(url) as HttpWebRequest;
設置相關屬性與請求參數后,接下來調用 HttpWebRequest. GetResponse 方法中通過 RequestUri 屬性發出同步請求,並返回 HttpWebResponse 包含響應的對象。
HttpWebResponse webResponse = webRequest.GetResponse() as HttpWebResponse;
可以使用 GetResponseStream 方法返回的流來接收響應的數據。 如果關閉響應對象或響應流時,剩余數據將作廢。 將耗盡剩余的數據並關閉流的響應對象,如果以下條件成立時,將為后續請求重新使用套接字: 它是保持活動狀態或通過管線傳輸請求,只有少量的數據需要接收,或在較短時間間隔內收到剩余數據。 如果沒有提到條件保存或超出消耗時間,將關閉套接字。 為保持活動狀態或通過管道傳遞的連接,我們強烈建議在應用程序直到 EOF 讀取流。 這可確保將生成更好的性能和更低的使用的資源的后續請求重復使用套接字。可以把HTTP響應的數據流(Stream)綁定到一個StreamReader對象,然后就可以通過ReadToEnd()方法把整個HTTP響應作為一個字符串取回。也可以通過 StreamReader.ReadLine()方法逐行取回HTTP響應的內容。
using (StreamReader sr = new StreamReader(webResponse.GetResponseStream())) { string content = sr.ReadToEnd(); }
當您想要將數據發送到資源時,GetRequestStream方法返回一個Stream對象以用於發送數據。該BeginGetRequestStream和EndGetRequestStream方法提供了發送數據流的異步訪問。
對於使用HttpWebRequest的客戶端身份驗證,客戶端證書必須安裝在當前用戶的My certificate store中。
該HttpWebRequest的類會引發引發WebException同時訪問資源時發生錯誤。該WebException.Status屬性包含一個WebExceptionStatus值,指示錯誤的來源。當WebException.Status是WebExceptionStatus.ProtocolError時,Response屬性包含從資源接收的HttpWebResponse。
1 /// <summary> 2 /// HTTP請求(包含文本的body數據) 3 /// </summary> 4 /// <param name="url">請求目標URL</param> 5 /// <param name="data">主體數據(普通文本或者JSON文本)</param> 6 /// <param name="method">請求的方法。請使用 WebRequestMethods.Http 的枚舉值</param> 7 /// <param name="contentType"><see langword="Content-type" /> HTTP 標頭的值。請使用 ContentType 類的常量來獲取</param> 8 /// <returns></returns> 9 private HttpResult Request(string url, string data, string method, string contentType) 10 { 11 HttpResult httpResult = new HttpResult(); 12 HttpWebRequest webRequest = null; 13 14 try 15 { 16 webRequest = WebRequest.Create(url) as HttpWebRequest; 17 webRequest.Method = method; 18 webRequest.Headers = HeaderCollection; 19 webRequest.CookieContainer = CookieContainer; 20 webRequest.ContentType = contentType; 21 webRequest.UserAgent = _userAgent; 22 webRequest.AllowAutoRedirect = _allowAutoRedirect; 23 webRequest.ServicePoint.Expect100Continue = false; 24 25 if (data != null) 26 { 27 webRequest.AllowWriteStreamBuffering = true; 28 using (Stream requestStream = webRequest.GetRequestStream()) 29 { 30 requestStream.Write(EncodingType.GetBytes(data), 0, data.Length); 31 requestStream.Flush(); 32 } 33 } 34 35 HttpWebResponse webResponse = webRequest.GetResponse() as HttpWebResponse; 36 if (webResponse != null) 37 { 38 GetResponse(ref httpResult, webResponse); 39 webResponse.Close(); 40 } 41 } 42 catch (WebException webException) 43 { 44 GetWebExceptionResponse(ref httpResult, webException); 45 } 46 catch (Exception ex) 47 { 48 GetExceptionResponse(ref httpResult, ex, method, contentType); 49 } 50 finally 51 { 52 if (webRequest != null) 53 { 54 webRequest.Abort(); 55 } 56 } 57 58 return httpResult; 59 }
1 /// <summary> 2 /// 獲取HTTP訪問網絡期間發生錯誤時引發的異常響應信息 3 /// </summary> 4 /// <param name="httpResult">即將被HTTP請求封裝函數返回的HttpResult變量</param> 5 /// <param name="webException">訪問網絡期間發生錯誤時引發的異常對象</param> 6 private void GetWebExceptionResponse(ref HttpResult httpResult, WebException webException) 7 { 8 HttpWebResponse exResponse = webException.Response as HttpWebResponse; 9 if (exResponse != null) 10 { 11 httpResult.HttpWebResponse = exResponse; 12 httpResult.Status = HttpResult.STATUS_FAIL; 13 httpResult.StatusDescription = exResponse.StatusDescription; 14 httpResult.StatusCode = (int)exResponse.StatusCode; 15 16 httpResult.RefCode = httpResult.StatusCode; 17 using (StreamReader sr = new StreamReader(exResponse.GetResponseStream(), EncodingType)) 18 { 19 httpResult.Text = sr.ReadToEnd(); 20 httpResult.RefText = httpResult.Text; 21 } 22 23 exResponse.Close(); 24 } 25 }
HttpWebRequest公開發送到Internet資源的公共HTTP標頭值作為屬性,由方法設置或由系統設置; 下表包含完整列表。您可以在Headers屬性中將其他標頭設置為名稱/值對。請注意,服務器和緩存可能會在請求期間更改或添加標頭。
下表列出了由屬性或方法或系統設置的HTTP標頭。下表列出了由屬性或方法或系統設置的HTTP標頭。
Header | 通過設置 |
---|---|
接受 | 通過設置Accept屬性。 |
連接 | 通過設置Connection屬性,KeepAlive屬性。 |
內容長度 | 通過設置ContentLength屬性。 |
Content-Type | 通過設置ContentType屬性。 |
期望 | 通過設置Expect屬性。 |
日期 | 設置當前日期到系統。 |
Host | 設置為當前主機信息系統。 |
If-Modified-Since | 通過設置IfModifiedSince屬性。 |
范圍 | 通過設置AddRange方法。 |
引用站點 | 通過設置Referer屬性。 |
Transfer-Encoding | 通過設置TransferEncoding屬性 (SendChunked屬性必須為true )。 |
用戶代理 | 通過設置UserAgent屬性。 |
本地計算機或應用程序配置文件可以指定使用默認代理。如果Proxy指定的屬性,然后從代理設置Proxy屬性來覆蓋本地計算機或應用程序配置文件和HttpWebRequest的實例將使用指定的代理服務器設置。如果在配置文件中未指定代理且未指定Proxy屬性,則HttpWebRequest類將使用從本地計算機上的Internet Explorer繼承的代理設置。如果Internet Explorer中沒有代理設置,則請求將直接發送到服務器。
HttpWebRequest類繼承自 Internet 資源管理器以不同的方式不是直接通過 Internet Explorer 分析跳過列表的通配符字符與分析代理跳過列表。 例如,HttpWebRequest類分析的正則表達式的"nt *"從 Internet 資源管理器的跳過列表"nt。 $"。 這不同於 Internet Explorer 的本機行為。 因此的 URL"http://intxxxxx
"將繞過代理帳戶使用HttpWebRequest類,但將不使用 Internet Explorer 使用代理。
如果可能,框架會在創建SSL會話時對其進行緩存,並嘗試將緩存會話重新用於新請求。嘗試重用SSL會話時,Framework使用ClientCertificates的第一個元素(如果有),或者如果ClientCertificates為空,則嘗試重用匿名會話。
出於安全原因,默認情況下禁用cookie。如果要使用cookie,請使用CookieContainer屬性啟用cookie。
.NET Framework 4.6 包括一個新的安全功能,將阻止不安全的密碼和哈希算法的連接。 默認情況下,使用 TLS/SSL 通過 HttpClient、 HttpWebRequest、 FTPClient,SmtpClient、 SslStream 等 Api 和面向.NET Framework 4.6 的應用程序獲得更安全的行為。
開發人員可能想要選擇退出此行為以便保持與帶 RC4 服務及其現有 SSL3 服務或 TLS 互操作性。 這篇文章介紹了如何修改你的代碼,以便禁用新行為。
Accept | 獲取或設置 |
Address | 獲取實際響應請求的 Internet 資源的統一資源標識符 (URI)。 |
AllowAutoRedirect | 獲取或設置一個值,該值指示請求是否應跟隨重定向響應。 |
AllowReadStreamBuffering | 獲取或設置一個值,該值指示是否對從 Internet 資源接收的數據進行緩沖處理。 |
AllowWriteStreamBuffering | 獲取或設置一個值,該值指示是否對發送到 Internet 資源的數據進行緩沖處理。 |
AuthenticationLevel | 獲取或設置用於此請求的身份驗證和模擬的級別。 (Inherited from WebRequest) |
AutomaticDecompression | 獲取或設置所使用的解壓縮類型。 |
CachePolicy | 獲取或設置此請求的緩存策略。 (Inherited from WebRequest) |
ClientCertificates | 獲取或設置與此請求關聯的安全證書集合。 |
Connection | 獲取或設置 |
ConnectionGroupName | 獲取或設置請求的連接組的名稱。 |
ContentLength | 獲取或設置 |
ContentType | 獲取或設置 |
ContinueDelegate | 獲取或設置當從 Internet 資源接收到 HTTP 100-continue 響應時調用的委托方法。 |
ContinueTimeout | 獲取或設置在接收到來自服務器的 100-Continue 之前要等待的超時(以毫秒為單位)。 |
CookieContainer | 獲取或設置與此請求關聯的 Cookie。 |
CreatorInstance | 當在子類中重寫時,獲取從 IWebRequestCreate 類派生的工廠對象,該類用於創建為生成對指定 URI 的請求而實例化的 WebRequest。 (Inherited from WebRequest) |
Credentials | 獲取或設置請求的身份驗證信息。 |
Date | 獲取或設置要在 HTTP 請求中使用的 |
DefaultCachePolicy | 獲取或設置此請求的默認緩存策略。 |
DefaultMaximumErrorResponseLength | 獲取或設置 HTTP 錯誤響應的默認最大長度。 |
DefaultMaximumResponseHeadersLength | 獲取或設置 MaximumResponseHeadersLength 屬性的默認值。 |
Expect | 獲取或設置 |
HaveResponse | 獲取一個值,該值指示是否收到了來自 Internet 資源的響應。 |
Headers | 指定構成 HTTP 標頭的名稱/值對的集合。 |
Host | 獲取或設置要在 HTTP 請求中獨立於請求 URI 使用的 Host 標頭值。 |
IfModifiedSince | 獲取或設置 |
ImpersonationLevel | 獲取或設置當前請求的模擬級別。 (Inherited from WebRequest) |
KeepAlive | 獲取或設置一個值,該值指示是否與 Internet 資源建立持久性連接。 |
MaximumAutomaticRedirections | 獲取或設置請求將跟隨的重定向的最大數目。 |
MaximumResponseHeadersLength | 獲取或設置響應標頭允許的最大長度。 |
MediaType | 獲取或設置請求的媒體類型。 |
Method | 獲取或設置請求的方法。 |
Pipelined | 獲取或設置一個值,該值指示是否通過管線將請求傳輸到 Internet 資源。 |
PreAuthenticate | 獲取或設置一個值,該值指示是否隨請求發送一個身份驗證標頭。 |
ProtocolVersion | 獲取或設置用於請求的 HTTP 版本。 |
Proxy | 獲取或設置請求的代理信息。 |
ReadWriteTimeout | 獲取或設置寫入或讀取流時的超時(以毫秒為單位)。 |
Referer | 獲取或設置 |
RequestUri | 獲取請求的原始統一資源標識符 (URI)。 |
SendChunked | 獲取或設置一個值,該值指示是否將數據分段發送到 Internet 資源。 |
ServerCertificateValidationCallback | 獲取或設置用於驗證服務器證書的回調函數。 |
ServicePoint | 獲取用於請求的服務點。 |
SupportsCookieContainer | 獲取一個值,該值指示請求是否為 CookieContainer 提供支持。 |
Timeout | 獲取或設置 GetResponse() 和 GetRequestStream() 方法的超時值(以毫秒為單位)。 |
TransferEncoding | 獲取或設置 |
UnsafeAuthenticatedConnectionSharing | 獲取或設置一個值,該值指示是否允許經過高速 NTLM 身份驗證的連接共享。 |
UseDefaultCredentials | 獲取或設置一個 Boolean 值,該值控制默認憑據是否隨請求一起發送。 |
UserAgent | 獲取或設置 |
若要訪問請求的 URI 或請求重定向到任何 URI。 關聯的枚舉: Connect