C# HTTP系列1 HttpWebRequest類


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

  對於使用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屬性中將其他標頭設置為名稱/值對。請注意,服務器和緩存可能會在請求期間更改或添加標頭。

下表列出了由屬性或方法或系統設置的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
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM