.NET 中的 HTTP 支援

超文字傳輸通訊協定 (或 HTTP) 是一種從網頁伺服器要求資源的通訊協定。 類別 System.Net.Http.HttpClient 會公開從 URI 所識別的資源傳送 HTTP 要求和接收 HTTP 回應的能力。 網路上有許多可用的資源類型,而 HTTP 會定義一組要求方法來存取這些資源。

HTTP 要求方法

要求方法會透過數個因素來區分,首先會依 動詞 來區分,但也透過下列特性來區分:

  • 如果要求方法可以成功處理多次,而不需變更結果,則要求方法是 等冪 的。 如需詳細資訊,請參閱 RFC 9110:9.2.2。等冪方法
  • 當可以儲存要求方法的對應回應以供重複使用時,即可 快取 要求方法。 如需詳細資訊,請參閱 RFC 9110:第 9.2.3 節。方法和快取
  • 如果要求方法未修改資源的狀態,則會被視為 安全的方法 。 所有 安全方法 也是 等冪方法,但並非所有 等冪 方法都視為 安全。 如需詳細資訊,請參閱 RFC 9110:第 9.2.1 節。安全方法
HTTP method 為等冪 可快取 安全
GET ✔️ 是的 ✔️ 是的 ✔️ 是的
POST ❌ 否 ⚠️ Rarely ❌ 否
PUT ✔️ 是的 ❌ 否 ❌ 否
PATCH ❌ 否 ❌ 否 ❌ 否
DELETE ✔️ 是的 ❌ 否 ❌ 否
HEAD ✔️ 是的 ✔️ 是的 ✔️ 是的
OPTIONS ✔️ 是的 ❌ 否 ✔️ 是的
TRACE ✔️ 是的 ❌ 否 ✔️ 是的
CONNECT ❌ 否 ❌ 否 ❌ 否

只有在 POST 適當的 Cache-ControlExpires 回應標頭存在時,才能快取方法。 這在實務上非常罕見。

HTTP 狀態碼

.NET 提供 HTTP 通訊協定的完整支援,這些通訊協定構成大部分的網際網路流量,以及 HttpClient 。 如需詳細資訊,請參閱 使用 HttpClient 類別提出 HTTP 要求。 應用程式藉由攔截 HttpRequestException 來接收 HTTP 通訊協定錯誤。 如果呼叫的方法未傳迴響應消息,則會在 中 HttpResponseMessageHttpResponseMessage.StatusCodeHttpRequestExceptionHttpRequestException.StatusCode 回報 HTTP 狀態碼或 中。 如需錯誤處理的詳細資訊,請參閱 HTTP 錯誤處理,如需狀態碼的詳細資訊,請參閱 RFC 9110、HTTP 語意:狀態碼

資訊狀態碼

參考狀態碼反映暫時回應。 例如 HttpStatusCode.Continue ,大部分的過渡回應會在內部 HttpClient 處理,且永遠不會向使用者呈現。

HTTP 狀態碼 HttpStatusCode
100 HttpStatusCode.Continue
101 HttpStatusCode.SwitchingProtocols
102 HttpStatusCode.Processing
103 HttpStatusCode.EarlyHints

成功狀態碼

成功的狀態碼表示已成功接收、瞭解及接受用戶端的要求。

HTTP 狀態碼 HttpStatusCode
200 HttpStatusCode.OK
201 HttpStatusCode.Created
202 HttpStatusCode.Accepted
203 HttpStatusCode.NonAuthoritativeInformation
204 HttpStatusCode.NoContent
205 HttpStatusCode.ResetContent
206 HttpStatusCode.PartialContent
207 HttpStatusCode.MultiStatus
208 HttpStatusCode.AlreadyReported
226 HttpStatusCode.IMUsed

重新導向狀態碼

重新導向狀態碼需要使用者代理程式採取動作,才能完成要求。 預設會開啟自動重新導向,可以使用 或 SocketsHttpHandler.AllowAutoRedirect 進行變更 HttpClientHandler.AllowAutoRedirect

HTTP 狀態碼 HttpStatusCode
300 HttpStatusCode.MultipleChoicesHttpStatusCode.Ambiguous
301 HttpStatusCode.MovedPermanentlyHttpStatusCode.Moved
302 HttpStatusCode.FoundHttpStatusCode.Redirect
303 HttpStatusCode.SeeOtherHttpStatusCode.RedirectMethod
304 HttpStatusCode.NotModified
305 HttpStatusCode.UseProxy
306 HttpStatusCode.Unused
307 HttpStatusCode.TemporaryRedirectHttpStatusCode.RedirectKeepVerb
308 HttpStatusCode.PermanentRedirect

用戶端錯誤狀態碼

用戶端錯誤狀態碼表示用戶端的要求無效。

HTTP 狀態碼 HttpStatusCode
400 HttpStatusCode.BadRequest
401 HttpStatusCode.Unauthorized
402 HttpStatusCode.PaymentRequired
403 HttpStatusCode.Forbidden
404 HttpStatusCode.NotFound
405 HttpStatusCode.MethodNotAllowed
406 HttpStatusCode.NotAcceptable
407 HttpStatusCode.ProxyAuthenticationRequired
408 HttpStatusCode.RequestTimeout
409 HttpStatusCode.Conflict
410 HttpStatusCode.Gone
411 HttpStatusCode.LengthRequired
412 HttpStatusCode.PreconditionFailed
413 HttpStatusCode.RequestEntityTooLarge
414 HttpStatusCode.RequestUriTooLong
415 HttpStatusCode.UnsupportedMediaType
416 HttpStatusCode.RequestedRangeNotSatisfiable
417 HttpStatusCode.ExpectationFailed
418 我是一個紅杯 🫖
421 HttpStatusCode.MisdirectedRequest
422 HttpStatusCode.UnprocessableEntity
423 HttpStatusCode.Locked
424 HttpStatusCode.FailedDependency
426 HttpStatusCode.UpgradeRequired
428 HttpStatusCode.PreconditionRequired
429 HttpStatusCode.TooManyRequests
431 HttpStatusCode.RequestHeaderFieldsTooLarge
451 HttpStatusCode.UnavailableForLegalReasons

伺服器錯誤狀態碼

伺服器錯誤狀態碼表示伺服器遇到無法滿足要求的非預期狀況。

HTTP 狀態碼 HttpStatusCode
500 HttpStatusCode.InternalServerError
501 HttpStatusCode.NotImplemented
502 HttpStatusCode.BadGateway
503 HttpStatusCode.ServiceUnavailable
504 HttpStatusCode.GatewayTimeout
505 HttpStatusCode.HttpVersionNotSupported
506 HttpStatusCode.VariantAlsoNegotiates
507 HttpStatusCode.InsufficientStorage
508 HttpStatusCode.LoopDetected
510 HttpStatusCode.NotExtended
511 HttpStatusCode.NetworkAuthenticationRequired

另請參閱