.NET 中的 HTTP 支援

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

HTTP 要求方法

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

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

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

HTTP 狀態碼

.NET 透過 HttpClient 為 HTTP 通訊協定提供完整支援,該通訊協定是大部分網際網路流量的來源。 如需詳細資訊,請參閱使用 HttpClient 類別提出 HTTP 要求。 應用程式藉由捕捉 HttpRequestException,以便接收 HTTP 通訊協定錯誤。 如果呼叫的方法未傳回回應訊息,則會在具有 HttpResponseMessage.StatusCodeHttpResponseMessage 中,或在具有 HttpRequestException.StatusCodeHttpRequestException 中報告 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

重新導向狀態碼

重新導向狀態碼需要使用者代理程式採取動作以完成要求。 預設會開啟自動重新導向,可以使用 HttpClientHandler.AllowAutoRedirectSocketsHttpHandler.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

另請參閱