C# HTTP系列1 HttpWebRequest類

  .NET Framework 中 System.Net 命名空間下提供了 HttpWebRequestHttpWebResponse 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對象以用於發送數據。該BeginGetRequestStreamEndGetRequestStream方法提供了發送數據流的異步訪問。web

  對於使用HttpWebRequest的客戶端身份驗證,客戶端證書必須安裝在當前用戶的My certificate store中。正則表達式

  該HttpWebRequest的類會引起引起WebException同時訪問資源時發生錯誤。該WebException.Status屬性包含一個WebExceptionStatus值,指示錯誤的來源。當WebException.StatusWebExceptionStatus.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

獲取或設置 Accept HTTP 標頭的值。

Address

獲取實際響應請求的 Internet 資源的統一資源標識符 (URI)。

AllowAutoRedirect

獲取或設置一個值,該值指示請求是否應跟隨重定向響應。

AllowReadStreamBuffering

獲取或設置一個值,該值指示是否對從 Internet 資源接收的數據進行緩衝處理。

AllowWriteStreamBuffering

獲取或設置一個值,該值指示是否對發送到 Internet 資源的數據進行緩衝處理。

AuthenticationLevel

獲取或設置用於此請求的身份驗證和模擬的級別。

(Inherited from WebRequest)
AutomaticDecompression

獲取或設置所使用的解壓縮類型。

CachePolicy

獲取或設置此請求的緩存策略。

(Inherited from WebRequest)
ClientCertificates

獲取或設置與此請求關聯的安全證書集合。

Connection

獲取或設置 Connection HTTP 標頭的值。

ConnectionGroupName

獲取或設置請求的鏈接組的名稱。

ContentLength

獲取或設置 Content-length HTTP 標頭。

ContentType

獲取或設置 Content-type HTTP 標頭的值。

ContinueDelegate

獲取或設置當從 Internet 資源接收到 HTTP 100-continue 響應時調用的委託方法。

ContinueTimeout

獲取或設置在接收到來自服務器的 100-Continue 以前要等待的超時(以毫秒爲單位)。

CookieContainer

獲取或設置與此請求關聯的 Cookie。

CreatorInstance

當在子類中重寫時,獲取從 IWebRequestCreate 類派生的工廠對象,該類用於建立爲生成對指定 URI 的請求而實例化的 WebRequest

(Inherited from WebRequest)
Credentials

獲取或設置請求的身份驗證信息。

Date

獲取或設置要在 HTTP 請求中使用的 Date HTTP 標頭值。

DefaultCachePolicy

獲取或設置此請求的默認緩存策略。

DefaultMaximumErrorResponseLength

獲取或設置 HTTP 錯誤響應的默認最大長度。

DefaultMaximumResponseHeadersLength

獲取或設置 MaximumResponseHeadersLength 屬性的默認值。

Expect

獲取或設置 Expect HTTP 標頭的值。

HaveResponse

獲取一個值,該值指示是否收到了來自 Internet 資源的響應。

Headers

指定構成 HTTP 標頭的名稱/值對的集合。

Host

獲取或設置要在 HTTP 請求中獨立於請求 URI 使用的 Host 標頭值。

IfModifiedSince

獲取或設置 If-Modified-Since HTTP 標頭的值。

ImpersonationLevel

獲取或設置當前請求的模擬級別。

(Inherited from WebRequest)
KeepAlive

獲取或設置一個值,該值指示是否與 Internet 資源創建持久性鏈接。

MaximumAutomaticRedirections

獲取或設置請求將跟隨的重定向的最大數目。

MaximumResponseHeadersLength

獲取或設置響應標頭容許的最大長度。

MediaType

獲取或設置請求的媒體類型。

Method

獲取或設置請求的方法。

Pipelined

獲取或設置一個值,該值指示是否經過管線將請求傳輸到 Internet 資源。

PreAuthenticate

獲取或設置一個值,該值指示是否隨請求發送一個身份驗證標頭。

ProtocolVersion

獲取或設置用於請求的 HTTP 版本。

Proxy

獲取或設置請求的代理信息。

ReadWriteTimeout

獲取或設置寫入或讀取流時的超時(以毫秒爲單位)。

Referer

獲取或設置 Referer HTTP 標頭的值。

RequestUri

獲取請求的原始統一資源標識符 (URI)。

SendChunked

獲取或設置一個值,該值指示是否將數據分段發送到 Internet 資源。

ServerCertificateValidationCallback

獲取或設置用於驗證服務器證書的回調函數。

ServicePoint

獲取用於請求的服務點。

SupportsCookieContainer

獲取一個值,該值指示請求是否爲 CookieContainer 提供支持。

Timeout

獲取或設置 GetResponse() 和 GetRequestStream() 方法的超時值(以毫秒爲單位)。

TransferEncoding

獲取或設置 Transfer-encoding HTTP 標頭的值。

UnsafeAuthenticatedConnectionSharing

獲取或設置一個值,該值指示是否容許通過高速 NTLM 身份驗證的鏈接共享。

UseDefaultCredentials

獲取或設置一個 Boolean 值,該值控制默認憑據是否隨請求一塊兒發送。

UserAgent

獲取或設置 User-agent HTTP 標頭的值。

 
方法
Abort()

取消對 Internet 資源的請求。

AddRange(Int32)

向請求添加從請求數據的開始處或結束處的特定範圍的字節範圍標頭。

AddRange(Int32, Int32)

向請求添加指定範圍的字節範圍標頭。

AddRange(Int64)

向請求添加從請求數據的開始處或結束處的特定範圍的字節範圍標頭。

AddRange(Int64, Int64)

向請求添加指定範圍的字節範圍標頭。

AddRange(String, Int32)

向請求添加從請求數據的開始處或結束處計算的特定範圍的 Range 標頭。

AddRange(String, Int32, Int32)

向請求添加指定範圍的範圍標頭。

AddRange(String, Int64)

向請求添加從請求數據的開始處或結束處計算的特定範圍的 Range 標頭。

AddRange(String, Int64, Int64)

向請求添加指定範圍的範圍標頭。

BeginGetRequestStream(AsyncCallback, Object)

開始對用於寫入數據的 Stream 對象執行異步請求。

BeginGetResponse(AsyncCallback, Object)

開始對 Internet 資源的異步請求。

CreateObjRef(Type)

建立一個對象,該對象包含生成用於與遠程對象進行通訊的代理所需的所有相關信息。

(Inherited from MarshalByRefObject)
EndGetRequestStream(IAsyncResult)

結束對用於寫入數據的 Stream 對象的異步請求。

EndGetRequestStream(IAsyncResult, TransportContext)

結束對用於寫入數據的 Stream 對象的異步請求,並輸出與該流關聯的 TransportContext

EndGetResponse(IAsyncResult)

結束對 Internet 資源的異步請求。

Equals(Object)

肯定指定的對象是否等於當前對象。

(Inherited from Object)
GetLifetimeService()

檢索控制此實例的生存期策略的當前生存期服務對象。

(Inherited from MarshalByRefObject)
GetObjectData(SerializationInfo, StreamingContext)

使用序列化目標對象所需的數據填充 SerializationInfo

GetRequestStream()

獲取用於寫入請求數據的 Stream 對象。

GetRequestStream(TransportContext)

獲取用於寫入請求數據的 Stream 對象,並輸出與該流關聯的 TransportContext

GetRequestStreamAsync()

當在子類中被重寫時,將用於寫入數據的 Stream 做爲異步操做返回到 Internet 資源。

(Inherited from WebRequest)
GetResponse()

返回來自 Internet 資源的響應。

GetResponseAsync()

當在子類中被重寫時,將做爲異步操做返回對 Internet 請求的響應。

(Inherited from WebRequest)
GetType()

獲取當前實例的 Type

(Inherited from Object)
InitializeLifetimeService()

獲取生存期服務對象來控制此實例的生存期策略。

(Inherited from MarshalByRefObject)
MemberwiseClone()

建立當前 Object 的淺表副本。

(Inherited from Object)
MemberwiseClone(Boolean)

建立當前 MarshalByRefObject 對象的淺表副本。

(Inherited from MarshalByRefObject)
ToString()

返回表示當前對象的字符串。

(Inherited from Object)
 
安全性
WebPermission 
若要訪問請求的 URI 或請求重定向到任何 URI。 關聯的枚舉: Connect
 
相關文章
相關標籤/搜索