.NET Framework 中 System.Net 命名空間下提供了 HttpWebRequest 和 HttpWebResponse 2個類,他們是用於發送和接收HTTP數據的最好選擇。它們支持一系列有用的屬性。默認狀況下這2個類對於控制檯程序、WinForm、ASP.NET來講都是可訪問的。HttpWebRequest 對象不是利用 new 關鍵字經過構造函數來建立的,而是利用工廠機制(factory mechanism),經過抽象類WebRequest.Create()方法來建立的。html
HttpWebRequest webRequest = WebRequest.Create(url) as HttpWebRequest;
設置相關屬性與請求參數後,接下來調用 HttpWebRequest. GetResponse 方法中經過 RequestUri 屬性發出同步請求,並返回 HttpWebResponse 包含響應的對象。 android
HttpWebResponse webResponse = webRequest.GetResponse() as HttpWebResponse;
可使用 GetResponseStream 方法返回的流來接收響應的數據。 若是關閉響應對象或響應流時,剩餘數據將做廢。 將耗盡剩餘的數據並關閉流的響應對象,若是如下條件成立時,將爲後續請求從新使用套接字: 它是保持活動狀態或經過管線傳輸請求,只有少許的數據須要接收,或在較短期間隔內收到剩餘數據。 若是沒有提到條件保存或超出消耗時間,將關閉套接字。 爲保持活動狀態或經過管道傳遞的鏈接,咱們強烈建議在應用程序直到 EOF 讀取流。 這可確保將生成更好的性能和更低的使用的資源的後續請求重複使用套接字。能夠把HTTP響應的數據流(Stream)綁定到一個StreamReader對象,而後就能夠經過ReadToEnd()方法把整個HTTP響應做爲一個字符串取回。也能夠經過 StreamReader.ReadLine()方法逐行取回HTTP響應的內容。ios
using (StreamReader sr = new StreamReader(webResponse.GetResponseStream())) { string content = sr.ReadToEnd(); }
當您想要將數據發送到資源時,GetRequestStream方法返回一個Stream對象以用於發送數據。該BeginGetRequestStream和EndGetRequestStream方法提供了發送數據流的異步訪問。web
對於使用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屬性中將其餘標頭設置爲名稱/值對。請注意,服務器和緩存可能會在請求期間更改或添加標頭。api
下表列出了由屬性或方法或系統設置的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 | 獲取或設置 |